10/38 PLS-00201: 'ID' must be declared
Você está selecionando dados em uma variável local
ID
que não foi declarado. Se você quiser declarar uma variável local, faça isso na seção de declaração entre o AS
e o 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 você for fazer isso, use a variável local
id
em seu INSERT
instrução em vez de chamar emp_sequence.nextval
diretamente. Pessoalmente, porém, eu me livraria da variável local, me livraria do SELECT
inicial , e apenas faça o emp_sequence.nextval
chame seu INSERT
declaração. 11/17 PL/SQL: ORA-00913: too many values
Independentemente de como você fizer isso, você precisará do número de colunas em seu
INSERT
para corresponder ao número de VALUES
você 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;
Ou se você quiser chamar a sequência diretamente
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;
Da mesma forma, para seu próximo erro, o número de variáveis que você busca deve corresponder ao número de colunas que você está selecionando
51/5 PL/SQL: ORA-00947: insufficient values
Em seu read_emp, você está selecionando 7 coisas e tentando colocá-las em 6 variáveis. Supondo que você não queira retornar o
employee_id
, não se preocupe em selecioná-lo. 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;
Enquanto você pode escrever um
read_emp
procedimento como este, geralmente faria mais sentido criar uma função que retornasse um employees%rowtype
gravar em vez disso. Suas cláusulas de exceção devem ser removidas. Na melhor das hipóteses, eles estão descartando a pilha de erros que diria a uma pessoa o que falhou e onde. Na pior das hipóteses, eles estão escondendo os erros (você nunca deve presumir que alguém verá algo que você escreve em
dbms_output
) e fazendo com que o código de chamada acredite que alguma operação foi bem-sucedida quando não.