Oracle
 sql >> база данни >  >> RDS >> Oracle

Грешки при създаването на тялото на пакета на Oracle

10/38    PLS-00201: 'ID' must be declared

Избирате данни в локална променлива ID който не е деклариран. Ако искате да декларирате локална променлива, трябва да го направите в секцията за деклариране между AS и 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;

Ако възнамерявате да направите това, бихте искали да използвате локалната променлива id във вашия INSERT израз вместо извикване на emp_sequence.nextval директно. Лично аз обаче бих се отървал от локалната променлива, от началния SELECT и просто направете emp_sequence.nextval обадете се във вашия INSERT изявление.

11/17    PL/SQL: ORA-00913: too many values

Независимо от начина, по който го правите обаче, ще имате нужда от броя на колоните във вашия INSERT за да съответства на броя на VALUES Вие посочвате.

   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;

Или ако искате да извикате последователността директно

   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;

По същия начин, за следващата ви грешка, броят на променливите, които извличате, трябва да съответства на броя на колоните, които избирате

51/5     PL/SQL: ORA-00947: insufficient values

Във вашия read_emp вие избирате 7 неща и се опитвате да ги поставите в 6 променливи. Ако приемем, че не искате да върнете employee_id , не си правете труда да го изберете.

   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;

Въпреки че можете да напишете read_emp процедура като тази, обикновено би било по-смислено да се създаде функция, която връща employees%rowtype запис вместо това.

Вашите клаузи за изключение трябва да бъдат премахнати. В най-добрия случай те изхвърлят стека от грешки, който би казал на човек какво се е провалило и къде. В най-лошия случай те крият грешките (никога не трябва да приемате, че някой някога ще види нещо, което пишете в dbms_output ) и каране на извикващия код да вярва, че дадена операция е успешна, когато не е.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Число на Oracle в C# десетичен знак

  2. променете състоянието на потребителския акаунт на Oracle от EXPIRE(GRACE) на OPEN

  3. IN срещу OR на Oracle, кое по-бързо?

  4. Хибернация на параметризирани sql заявки, бавни и активни сесии на oracle

  5. Импортирайте XML файл в Oracle XML DB Repository