sql >> Base de Datos >  >> RDS >> Oracle

Errores al crear el cuerpo del paquete de Oracle

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

Está seleccionando datos en una variable local ID que no ha sido declarado. Si desea declarar una variable local, debe hacerlo en la sección de declaración entre AS y el 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;

Si vas a hacer eso, querrás usar la variable local id en tu INSERT declaración en lugar de llamar a emp_sequence.nextval directamente. Personalmente, sin embargo, me desharía de la variable local, me desharía del SELECT inicial , y simplemente haga el emp_sequence.nextval llama a tu INSERT declaración.

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

Sin embargo, independientemente de cómo lo haga, necesitará la cantidad de columnas en su INSERT para que coincida con el número de VALUES usted especifica.

   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 si quieres llamar a la secuencia directamente

   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;

De manera similar, para su próximo error, la cantidad de variables que obtiene debe coincidir con la cantidad de columnas que está seleccionando

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

En su read_emp, está seleccionando 7 cosas y tratando de ponerlas en 6 variables. Suponiendo que no desea devolver el employee_id , no se moleste en seleccionarlo.

   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;

Si bien puedes escribir un read_emp procedimiento como este, generalmente tendría más sentido crear una función que devuelva un employees%rowtype grabar en su lugar.

Sus cláusulas de excepción deben eliminarse. En el mejor de los casos, están descartando la pila de errores que le diría a una persona qué falló y dónde. En el peor de los casos, ocultan los errores (nunca debe suponer que alguien verá algo que escriba en dbms_output ) y hacer que el código de llamada crea que alguna operación tuvo éxito cuando no fue así.