10/38 PLS-00201: 'ID' must be declared
Está seleccionando datos en una variable local ID
que no ha sido declarado. Si desea declarar una variable local, debe hacerlo en la sección de declaración entre AS
y el 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 vas a hacer eso, querrás usar la variable local id
en tu INSERT
declaración en lugar de llamar a emp_sequence.nextval
directamente. Personalmente, sin embargo, me desharía de la variable local, me desharía del SELECT
inicial , y simplemente haga el emp_sequence.nextval
llama a tu INSERT
declaración.
11/17 PL/SQL: ORA-00913: too many values
Sin embargo, independientemente de cómo lo haga, necesitará la cantidad de columnas en su INSERT
para que coincida con el número de VALUES
usted especifica.
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 si quieres llamar a la secuencia directamente
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 manera similar, para su próximo error, la cantidad de variables que obtiene debe coincidir con la cantidad de columnas que está seleccionando
51/5 PL/SQL: ORA-00947: insufficient values
En su read_emp, está seleccionando 7 cosas y tratando de ponerlas en 6 variables. Suponiendo que no desea devolver el employee_id
, no se moleste en seleccionarlo.
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;
Si bien puedes escribir un read_emp
procedimiento como este, generalmente tendría más sentido crear una función que devuelva un employees%rowtype
grabar en su lugar.
Sus cláusulas de excepción deben eliminarse. En el mejor de los casos, están descartando la pila de errores que le diría a una persona qué falló y dónde. En el peor de los casos, ocultan los errores (nunca debe suponer que alguien verá algo que escriba en dbms_output
) y hacer que el código de llamada crea que alguna operación tuvo éxito cuando no fue así.