Oracle
 sql >> Database >  >> RDS >> Oracle

Errori durante la creazione del corpo del pacchetto Oracle

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

Stai selezionando i dati in una variabile locale ID che non è stato dichiarato. Se vuoi dichiarare una variabile locale, dovresti farlo nella sezione di dichiarazione tra il AS e il 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;

Se hai intenzione di farlo, ti consigliamo di utilizzare la variabile locale id nel tuo INSERT istruzione anziché chiamare emp_sequence.nextval direttamente. Personalmente, però, eliminerei la variabile locale, eliminerei il SELECT iniziale , e fai semplicemente il emp_sequence.nextval chiama il tuo INSERT dichiarazione.

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

Indipendentemente da come lo fai, però, avresti bisogno del numero di colonne nel tuo INSERT per abbinare il numero di VALUES tu specifichi.

   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;

O se vuoi chiamare direttamente la sequenza

   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;

Allo stesso modo, per il tuo prossimo errore, il numero di variabili in cui recuperi dovrebbe corrispondere al numero di colonne che stai selezionando

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

Nel tuo read_emp, stai selezionando 7 cose e provando a inserirle in 6 variabili. Supponendo che tu non voglia restituire employee_id , non preoccuparti di selezionarlo.

   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;

Mentre puoi scrivere un read_emp procedura come questa, generalmente avrebbe più senso creare una funzione che restituisca un employees%rowtype registrare invece.

Le tue clausole di eccezione dovrebbero essere rimosse. Nella migliore delle ipotesi, stanno scartando lo stack di errori che direbbe a una persona cosa ha fallito e dove. Nel peggiore dei casi, nascondono gli errori (non dovresti mai presumere che qualcuno vedrà mai qualcosa che scrivi su dbms_output ) e facendo in modo che il codice chiamante creda che un'operazione sia riuscita quando non è andata a buon fine.