10/38 PLS-00201: 'ID' must be declared
Bạn đang chọn dữ liệu vào một biến cục bộ ID
điều đó chưa được khai báo. Nếu bạn muốn khai báo một biến cục bộ, bạn phải làm như vậy trong phần khai báo giữa AS
và BEGIN
PROCEDURE create_emp(p_last_name IN employees.last_name%type,
p_first_name IN employees.first_name%type,
p_email IN employees.email%type,
p_hire_date IN employees.hire_date%type,
p_job_id IN employees.job_id%type)
AS
id integer;
BEGIN
SELECT emp_sequence.NEXTVAL INTO id FROM dual;
Nếu bạn định làm điều đó, bạn muốn sử dụng biến cục bộ id
trong INSERT
của bạn thay vì gọi emp_sequence.nextval
trực tiếp. Cá nhân tôi, mặc dù vậy, tôi muốn loại bỏ biến cục bộ, loại bỏ SELECT
ban đầu và chỉ tạo emp_sequence.nextval
gọi trong INSERT
của bạn bản tường trình.
11/17 PL/SQL: ORA-00913: too many values
Tuy nhiên, bất kể bạn thực hiện như thế nào, bạn vẫn cần số lượng cột trong INSERT
của mình để khớp với số lượng VALUES
bạn chỉ định.
PROCEDURE create_emp(p_last_name IN employees.last_name%type,
p_first_name IN employees.first_name%type,
p_email IN employees.email%type,
p_hire_date IN employees.hire_date%type,
p_job_id IN employees.job_id%type)
AS
id integer;
BEGIN
SELECT emp_sequence.NEXTVAL INTO id FROM dual;
INSERT INTO employees(employee_id, last_name, first_name, email, hire_date, job_id)
VALUES (id, p_last_name, p_first_name, p_email, p_hire_date, p_job_id);
END create_emp;
Hoặc nếu bạn muốn gọi trực tiếp trình tự
PROCEDURE create_emp(p_last_name IN employees.last_name%type,
p_first_name IN employees.first_name%type,
p_email IN employees.email%type,
p_hire_date IN employees.hire_date%type,
p_job_id IN employees.job_id%type)
AS
BEGIN
INSERT INTO employees(employee_id, last_name, first_name, email, hire_date, job_id)
VALUES ( emp_sequence.NEXTVAL, p_last_name, p_first_name, p_email, p_hire_date, p_job_id);
END create_emp;
Tương tự, đối với lỗi tiếp theo của bạn, số lượng biến mà bạn tìm nạp phải khớp với số cột bạn đang chọn
51/5 PL/SQL: ORA-00947: insufficient values
Trong read_emp của bạn, bạn đang chọn 7 thứ và cố gắng đưa chúng vào 6 biến. Giả sử rằng bạn không muốn trả lại employee_id
, đừng bận tâm chọn nó.
PROCEDURE read_emp(p_employee_id IN employees.employee_id%type,
p_last_name OUT employees.last_name%type,
p_first_name OUT employees.first_name%type,
p_email OUT employees.email%type,
p_hire_date OUT employees.hire_date%type,
p_job_id OUT employees.job_id%type,
p_salary OUT employees.salary%type)
AS
BEGIN
SELECT last_name, first_name, email, hire_date, job_id, salary
INTO p_last_name, p_first_name, p_email, p_hire_date, p_job_id, p_salary
FROM EMPLOYEES
WHERE employee_id = p_employee_id;
END read_emp;
Trong khi bạn có thể viết read_emp
thủ tục như thế này, nói chung sẽ có ý nghĩa hơn khi tạo một hàm trả về employees%rowtype
ghi lại thay vào đó.
Các điều khoản ngoại lệ của bạn nên được loại bỏ. Tốt nhất, họ đang loại bỏ ngăn xếp lỗi có thể cho một người biết điều gì đã thất bại và ở đâu. Tệ nhất là chúng đang che giấu lỗi (bạn đừng bao giờ cho rằng có ai đó sẽ thấy bất cứ thứ gì mà bạn ghi vào dbms_output
) và khiến mã gọi tin rằng một số thao tác đã thành công khi không thực hiện được.