10/38 PLS-00201: 'ID' must be declared
U selecteert gegevens in een lokale variabele ID
dat is niet verklaard. Als u een lokale variabele wilt declareren, doet u dit in de declaratiesectie tussen de AS
en de 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;
Als je dat gaat doen, gebruik dan de lokale variabele id
in uw INSERT
statement in plaats van emp_sequence.nextval
aan te roepen direct. Persoonlijk zou ik echter de lokale variabele verwijderen, de initiële SELECT
. verwijderen , en maak gewoon de emp_sequence.nextval
roep uw INSERT
. in uitspraak.
11/17 PL/SQL: ORA-00913: too many values
Ongeacht hoe je het doet, je hebt echter het aantal kolommen nodig in je INSERT
overeenkomen met het aantal VALUES
u specificeert.
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;
Of als u de reeks rechtstreeks wilt oproepen
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;
Evenzo moet voor uw volgende fout het aantal variabelen dat u ophaalt overeenkomen met het aantal kolommen dat u selecteert
51/5 PL/SQL: ORA-00947: insufficient values
In uw read_emp selecteert u 7 dingen en probeert u ze in 6 variabelen te plaatsen. Ervan uitgaande dat u de employee_id
. niet wilt retourneren , doe geen moeite om het te selecteren.
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;
Terwijl je een read_emp
. kunt schrijven procedure als deze, zou het over het algemeen logischer zijn om een functie te maken die een employees%rowtype
retourneert in plaats daarvan opnemen.
Uw uitzonderingsclausules moeten worden verwijderd. In het beste geval gooien ze de foutenstapel weg die een persoon zou vertellen wat er is mislukt en waar. In het slechtste geval verbergen ze de fouten (je moet er nooit vanuit gaan dat iemand ooit iets zal zien dat je naar dbms_output
schrijft ) en de aanroepcode laten geloven dat een bewerking is gelukt, terwijl dat niet het geval was.