sql >> Databáze >  >> RDS >> Oracle

Chyby při vytváření těla balíčku Oracle

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

Vybíráte data do místní proměnné ID která nebyla vyhlášena. Pokud chcete deklarovat lokální proměnnou, udělali byste to v sekci deklarace mezi AS a 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;

Pokud to chcete udělat, měli byste použít místní proměnnou id ve vašem INSERT namísto volání emp_sequence.nextval přímo. Osobně bych se však zbavil lokální proměnné, zbavil se počátečního SELECT a jednoduše vytvořte emp_sequence.nextval zavolejte do INSERT tvrzení.

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

Bez ohledu na to, jak to uděláte, budete potřebovat počet sloupců v INSERT aby odpovídal počtu VALUES určíte.

   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;

Nebo pokud chcete volat sekvenci přímo

   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;

Podobně u další chyby by počet proměnných, do kterých načtete, měl odpovídat počtu sloupců, které vybíráte

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

Ve svém read_emp vybíráte 7 věcí a pokoušíte se je vložit do 6 proměnných. Za předpokladu, že nechcete vracet employee_id , neobtěžujte se výběrem.

   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;

Zatímco můžete napsat read_emp Při tomto postupu by obecně dávalo větší smysl vytvořit funkci, která vrací employees%rowtype místo toho zaznamenejte.

Vaše klauzule o výjimkách by měly být odstraněny. V nejlepším případě zahazují zásobník chyb, který by člověku řekl, co selhalo a kde. V nejhorším případě skrývají chyby (nikdy byste neměli předpokládat, že někdo uvidí něco, co zapíšete do dbms_output ) a způsobí, že volající kód uvěří, že nějaká operace byla úspěšná, i když ne.




  1. Kontingenční tabulka Laravel s více sloupci, které je třeba vložit později

  2. Hodnocení společných pozic v MySQL

  3. postgreSQL:jak duplikovat řádek

  4. mysql Neplatný počet sloupců ve vstupu CSV při importu souboru csv