Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Erros ao criar o corpo do pacote Oracle

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

Você está selecionando dados em uma variável local ID que não foi declarado. Se você quiser declarar uma variável local, faça isso na seção de declaração entre o AS e o 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 você for fazer isso, use a variável local id em seu INSERT instrução em vez de chamar emp_sequence.nextval diretamente. Pessoalmente, porém, eu me livraria da variável local, me livraria do SELECT inicial , e apenas faça o emp_sequence.nextval chame seu INSERT declaração.
11/17    PL/SQL: ORA-00913: too many values

Independentemente de como você fizer isso, você precisará do número de colunas em seu INSERT para corresponder ao número de VALUES você 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;

Ou se você quiser chamar a sequência diretamente
   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;

Da mesma forma, para seu próximo erro, o número de variáveis ​​que você busca deve corresponder ao número de colunas que você está selecionando
51/5     PL/SQL: ORA-00947: insufficient values

Em seu read_emp, você está selecionando 7 coisas e tentando colocá-las em 6 variáveis. Supondo que você não queira retornar o employee_id , não se preocupe em selecioná-lo.
   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;

Enquanto você pode escrever um read_emp procedimento como este, geralmente faria mais sentido criar uma função que retornasse um employees%rowtype gravar em vez disso.

Suas cláusulas de exceção devem ser removidas. Na melhor das hipóteses, eles estão descartando a pilha de erros que diria a uma pessoa o que falhou e onde. Na pior das hipóteses, eles estão escondendo os erros (você nunca deve presumir que alguém verá algo que você escreve em dbms_output ) e fazendo com que o código de chamada acredite que alguma operação foi bem-sucedida quando não.