10/38 PLS-00201: 'ID' must be declared
Stai selezionando i dati in una variabile locale ID
che non è stato dichiarato. Se vuoi dichiarare una variabile locale, dovresti farlo nella sezione di dichiarazione tra il AS
e il 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;
Se hai intenzione di farlo, ti consigliamo di utilizzare la variabile locale id
nel tuo INSERT
istruzione anziché chiamare emp_sequence.nextval
direttamente. Personalmente, però, eliminerei la variabile locale, eliminerei il SELECT
iniziale , e fai semplicemente il emp_sequence.nextval
chiama il tuo INSERT
dichiarazione.
11/17 PL/SQL: ORA-00913: too many values
Indipendentemente da come lo fai, però, avresti bisogno del numero di colonne nel tuo INSERT
per abbinare il numero di VALUES
tu specifichi.
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;
O se vuoi chiamare direttamente la sequenza
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;
Allo stesso modo, per il tuo prossimo errore, il numero di variabili in cui recuperi dovrebbe corrispondere al numero di colonne che stai selezionando
51/5 PL/SQL: ORA-00947: insufficient values
Nel tuo read_emp, stai selezionando 7 cose e provando a inserirle in 6 variabili. Supponendo che tu non voglia restituire employee_id
, non preoccuparti di selezionarlo.
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;
Mentre puoi scrivere un read_emp
procedura come questa, generalmente avrebbe più senso creare una funzione che restituisca un employees%rowtype
registrare invece.
Le tue clausole di eccezione dovrebbero essere rimosse. Nella migliore delle ipotesi, stanno scartando lo stack di errori che direbbe a una persona cosa ha fallito e dove. Nel peggiore dei casi, nascondono gli errori (non dovresti mai presumere che qualcuno vedrà mai qualcosa che scrivi su dbms_output
) e facendo in modo che il codice chiamante creda che un'operazione sia riuscita quando non è andata a buon fine.