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

Fejl ved oprettelse af Oracle-pakketekst

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

Du vælger data til en lokal variabel ID det er ikke blevet erklæret. Hvis du vil erklære en lokal variabel, skal du gøre det i deklarationsafsnittet mellem AS og 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;

Hvis du vil gøre det, vil du gerne bruge den lokale variabel id i din INSERT sætning i stedet for at kalde emp_sequence.nextval direkte. Personligt ville jeg dog slippe af med den lokale variabel, slippe af med den indledende SELECT , og lav bare emp_sequence.nextval indkald din INSERT udmelding.

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

Uanset hvordan du gør det, har du dog brug for antallet af kolonner i din INSERT for at matche antallet af VALUES du angiver.

   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;

Eller hvis du vil kalde sekvensen direkte

   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;

Tilsvarende skal antallet af variabler, som du henter til din næste fejl, svare til antallet af kolonner, du vælger

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

I din read_emp vælger du 7 ting og prøver at sætte dem ind i 6 variabler. Forudsat at du ikke ønsker at returnere employee_id , lad være med at vælge det.

   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;

Mens du kan skrive en read_emp fremgangsmåde som denne, ville det generelt give mere mening at oprette en funktion, der returnerer en employees%rowtype optag i stedet.

Dine undtagelsesbestemmelser bør fjernes. I bedste fald kasserer de fejlstakken, der ville fortælle en person, hvad der fejlede og hvor. I værste fald skjuler de fejlene (du skal aldrig gå ud fra, at nogen nogensinde vil se noget, du skriver til dbms_output ) og få opkaldskoden til at tro, at en eller anden handling lykkedes, når den ikke gjorde det.




  1. ClusterControl CMON HA for distribueret database høj tilgængelighed - del 2 (GUI-adgangsopsætning)

  2. Hvordan ville du modellere datavariables varians på fælles skema? SQL

  3. Hvordan forespørger man en json-kolonne for tomme objekter?

  4. hvordan man finder rækkestørrelse i tabel