10/38 PLS-00201: 'ID' must be declared
Vous sélectionnez des données dans une variable locale ID
qui n'a pas été déclaré. Si vous souhaitez déclarer une variable locale, vous devez le faire dans la section de déclaration entre le AS
et le 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;
Si vous allez faire cela, vous voudriez utiliser la variable locale id
dans votre INSERT
plutôt que d'appeler emp_sequence.nextval
directement. Personnellement, cependant, je me débarrasserais de la variable locale, je me débarrasserais du SELECT
initial , et faites juste le emp_sequence.nextval
appelez votre INSERT
déclaration.
11/17 PL/SQL: ORA-00913: too many values
Quelle que soit la façon dont vous le faites, cependant, vous aurez besoin du nombre de colonnes dans votre INSERT
pour correspondre au nombre de VALUES
vous spécifiez.
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;
Ou si vous voulez appeler directement la séquence
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;
De même, pour votre prochaine erreur, le nombre de variables que vous récupérez doit correspondre au nombre de colonnes que vous sélectionnez
51/5 PL/SQL: ORA-00947: insufficient values
Dans votre read_emp, vous sélectionnez 7 choses et essayez de les mettre dans 6 variables. En supposant que vous ne souhaitiez pas renvoyer le employee_id
, ne vous embêtez pas à le sélectionner.
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;
Alors que vous pouvez écrire un read_emp
procédure comme celle-ci, il serait généralement plus logique de créer une fonction qui renvoie un employees%rowtype
enregistrer à la place.
Vos clauses d'exception doivent être supprimées. Au mieux, ils rejettent la pile d'erreurs qui indiquerait à une personne ce qui a échoué et où. Au pire, ils cachent les erreurs (vous ne devriez jamais supposer que quelqu'un verra jamais ce que vous écrivez dans dbms_output
) et faisant croire au code appelant qu'une opération a réussi alors qu'elle n'a pas réussi.