Oracle
 sql >> Base de données >  >> RDS >> Oracle

Erreurs lors de la création du corps du package Oracle

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

Vous sélectionnez des données dans une variable locale ID qui n'a pas été déclaré. Si vous souhaitez déclarer une variable locale, vous devez le faire dans la section de déclaration entre le AS et le 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 vous allez faire cela, vous voudriez utiliser la variable locale id dans votre INSERT plutôt que d'appeler emp_sequence.nextval directement. Personnellement, cependant, je me débarrasserais de la variable locale, je me débarrasserais du SELECT initial , et faites juste le emp_sequence.nextval appelez votre INSERT déclaration.

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

Quelle que soit la façon dont vous le faites, cependant, vous aurez besoin du nombre de colonnes dans votre INSERT pour correspondre au nombre de VALUES vous spécifiez.

   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 si vous voulez appeler directement la séquence

   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 même, pour votre prochaine erreur, le nombre de variables que vous récupérez doit correspondre au nombre de colonnes que vous sélectionnez

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

Dans votre read_emp, vous sélectionnez 7 choses et essayez de les mettre dans 6 variables. En supposant que vous ne souhaitiez pas renvoyer le employee_id , ne vous embêtez pas à le sélectionner.

   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;

Alors que vous pouvez écrire un read_emp procédure comme celle-ci, il serait généralement plus logique de créer une fonction qui renvoie un employees%rowtype enregistrer à la place.

Vos clauses d'exception doivent être supprimées. Au mieux, ils rejettent la pile d'erreurs qui indiquerait à une personne ce qui a échoué et où. Au pire, ils cachent les erreurs (vous ne devriez jamais supposer que quelqu'un verra jamais ce que vous écrivez dans dbms_output ) et faisant croire au code appelant qu'une opération a réussi alors qu'elle n'a pas réussi.