10/38 PLS-00201: 'ID' must be declared
Избирате данни в локална променлива ID
който не е деклариран. Ако искате да декларирате локална променлива, трябва да го направите в секцията за деклариране между AS
и 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;
Ако възнамерявате да направите това, бихте искали да използвате локалната променлива id
във вашия INSERT
израз вместо извикване на emp_sequence.nextval
директно. Лично аз обаче бих се отървал от локалната променлива, от началния SELECT
и просто направете emp_sequence.nextval
обадете се във вашия INSERT
изявление.
11/17 PL/SQL: ORA-00913: too many values
Независимо от начина, по който го правите обаче, ще имате нужда от броя на колоните във вашия INSERT
за да съответства на броя на VALUES
Вие посочвате.
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;
Или ако искате да извикате последователността директно
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;
По същия начин, за следващата ви грешка, броят на променливите, които извличате, трябва да съответства на броя на колоните, които избирате
51/5 PL/SQL: ORA-00947: insufficient values
Във вашия read_emp вие избирате 7 неща и се опитвате да ги поставите в 6 променливи. Ако приемем, че не искате да върнете employee_id
, не си правете труда да го изберете.
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;
Въпреки че можете да напишете read_emp
процедура като тази, обикновено би било по-смислено да се създаде функция, която връща employees%rowtype
запис вместо това.
Вашите клаузи за изключение трябва да бъдат премахнати. В най-добрия случай те изхвърлят стека от грешки, който би казал на човек какво се е провалило и къде. В най-лошия случай те крият грешките (никога не трябва да приемате, че някой някога ще види нещо, което пишете в dbms_output
) и каране на извикващия код да вярва, че дадена операция е успешна, когато не е.