sql >> Database >  >> RDS >> Oracle

Fouten bij het maken van de hoofdtekst van het Oracle-pakket

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

U selecteert gegevens in een lokale variabele ID dat is niet verklaard. Als u een lokale variabele wilt declareren, doet u dit in de declaratiesectie tussen de AS en de 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;

Als je dat gaat doen, gebruik dan de lokale variabele id in uw INSERT statement in plaats van emp_sequence.nextval aan te roepen direct. Persoonlijk zou ik echter de lokale variabele verwijderen, de initiële SELECT . verwijderen , en maak gewoon de emp_sequence.nextval roep uw INSERT . in uitspraak.

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

Ongeacht hoe je het doet, je hebt echter het aantal kolommen nodig in je INSERT overeenkomen met het aantal VALUES u specificeert.

   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;

Of als u de reeks rechtstreeks wilt oproepen

   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;

Evenzo moet voor uw volgende fout het aantal variabelen dat u ophaalt overeenkomen met het aantal kolommen dat u selecteert

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

In uw read_emp selecteert u 7 dingen en probeert u ze in 6 variabelen te plaatsen. Ervan uitgaande dat u de employee_id . niet wilt retourneren , doe geen moeite om het te selecteren.

   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;

Terwijl je een read_emp . kunt schrijven procedure als deze, zou het over het algemeen logischer zijn om een ​​functie te maken die een employees%rowtype retourneert in plaats daarvan opnemen.

Uw uitzonderingsclausules moeten worden verwijderd. In het beste geval gooien ze de foutenstapel weg die een persoon zou vertellen wat er is mislukt en waar. In het slechtste geval verbergen ze de fouten (je moet er nooit vanuit gaan dat iemand ooit iets zal zien dat je naar dbms_output schrijft ) en de aanroepcode laten geloven dat een bewerking is gelukt, terwijl dat niet het geval was.




  1. Hoe kan ik een hele rij (in SQL, niet in PL/SQL) doorgeven aan een opgeslagen functie?

  2. PostGIS Geometry invoegen en selecteren met Gorm

  3. Multidimensionale array vullen

  4. Opgeslagen procedure-uitvoerparameters in SQL Server Profiler