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.