10/38 PLS-00201: 'ID' must be declared
Du vælger data til en lokal variabel ID
det er ikke blevet erklæret. Hvis du vil erklære en lokal variabel, skal du gøre det i deklarationsafsnittet mellem AS
og 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;
Hvis du vil gøre det, vil du gerne bruge den lokale variabel id
i din INSERT
sætning i stedet for at kalde emp_sequence.nextval
direkte. Personligt ville jeg dog slippe af med den lokale variabel, slippe af med den indledende SELECT
, og lav bare emp_sequence.nextval
indkald din INSERT
udmelding.
11/17 PL/SQL: ORA-00913: too many values
Uanset hvordan du gør det, har du dog brug for antallet af kolonner i din INSERT
for at matche antallet af VALUES
du angiver.
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;
Eller hvis du vil kalde sekvensen direkte
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;
Tilsvarende skal antallet af variabler, som du henter til din næste fejl, svare til antallet af kolonner, du vælger
51/5 PL/SQL: ORA-00947: insufficient values
I din read_emp vælger du 7 ting og prøver at sætte dem ind i 6 variabler. Forudsat at du ikke ønsker at returnere employee_id
, lad være med at vælge det.
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;
Mens du kan skrive en read_emp
fremgangsmåde som denne, ville det generelt give mere mening at oprette en funktion, der returnerer en employees%rowtype
optag i stedet.
Dine undtagelsesbestemmelser bør fjernes. I bedste fald kasserer de fejlstakken, der ville fortælle en person, hvad der fejlede og hvor. I værste fald skjuler de fejlene (du skal aldrig gå ud fra, at nogen nogensinde vil se noget, du skriver til dbms_output
) og få opkaldskoden til at tro, at en eller anden handling lykkedes, når den ikke gjorde det.