Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Fehler beim Erstellen des Oracle-Pakettexts

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

Sie wählen Daten in eine lokale Variable ID aus das ist nicht deklariert. Wenn Sie eine lokale Variable deklarieren möchten, tun Sie dies im Deklarationsabschnitt zwischen AS und der 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;

In diesem Fall sollten Sie die lokale Variable id verwenden in Ihrem INSERT -Anweisung, anstatt emp_sequence.nextval aufzurufen direkt. Persönlich würde ich jedoch die lokale Variable loswerden, das anfängliche SELECT loswerden , und machen Sie einfach emp_sequence.nextval Rufen Sie Ihr INSERT auf Aussage.

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

Unabhängig davon, wie Sie es tun, benötigen Sie jedoch die Anzahl der Spalten in Ihrem INSERT um der Anzahl von VALUES zu entsprechen Sie spezifizieren.

   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;

Oder wenn Sie die Sequenz direkt aufrufen möchten

   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;

Ebenso sollte für Ihren nächsten Fehler die Anzahl der Variablen, die Sie abrufen, mit der Anzahl der Spalten übereinstimmen, die Sie auswählen

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

In Ihrem read_emp wählen Sie 7 Dinge aus und versuchen, sie in 6 Variablen einzufügen. Angenommen, Sie möchten die employee_id nicht zurückgeben , machen Sie sich nicht die Mühe, es auszuwählen.

   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;

Während Sie einen read_emp schreiben können Vorgehensweise wie dieser, wäre es im Allgemeinen sinnvoller, eine Funktion zu erstellen, die einen employees%rowtype zurückgibt stattdessen aufzeichnen.

Ihre Ausnahmeklauseln sollten entfernt werden. Bestenfalls verwerfen sie den Fehlerstapel, der einer Person mitteilen würde, was wo fehlgeschlagen ist. Im schlimmsten Fall verbergen sie die Fehler (Sie sollten niemals davon ausgehen, dass irgendjemand jemals etwas sehen wird, was Sie in dbms_output schreiben ) und bewirkt, dass der aufrufende Code glaubt, dass eine Operation erfolgreich war, obwohl dies nicht der Fall war.