Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Lỗi khi tạo phần thân gói Oracle

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 ASBEGIN

   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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hàm TRANSLATE () trong Oracle

  2. Hàng đợi nâng cao Oracle trong Java

  3. Làm thế nào để sử dụng một lược đồ bởi nhiều người dùng mà không cần sửa trước tên lược đồ trước các đối tượng?

  4. Tại sao PL / SQL không tôn trọng các đặc quyền do Vai trò cấp?

  5. Oracle xuất SQL của cấu trúc Cơ sở dữ liệu