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.