10/38 PLS-00201: 'ID' must be declared
ローカル変数ID
にデータを選択しています それは宣言されていません。ローカル変数を宣言する場合は、AS
の間の宣言セクションで宣言します。 および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;
これを行う場合は、ローカル変数id
を使用することをお勧めします INSERT
で emp_sequence.nextval
を呼び出すのではなくステートメント 直接。ただし、個人的には、ローカル変数を削除し、最初のSELECT
を削除します。 、emp_sequence.nextval
を作成するだけです INSERT
を呼び出します 声明。
11/17 PL/SQL: ORA-00913: too many values
ただし、その方法に関係なく、INSERT
の列数が必要になります。 VALUES
の数と一致する 指定します。
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;
または、シーケンスを直接呼び出したい場合
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;
同様に、次のエラーの場合、フェッチする変数の数は、選択している列の数と一致する必要があります
51/5 PL/SQL: ORA-00947: insufficient values
read_empでは、7つのものを選択し、それらを6つの変数に入れようとしています。 employee_id
を返したくないと仮定します 、わざわざ選択しないでください。
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;
read_emp
を書くことはできますが このような手順では、通常、employees%rowtype
を返す関数を作成する方が理にかなっています。 代わりに記録してください。
例外条項を削除する必要があります。せいぜい、何がどこで失敗したかを人に伝えるエラースタックを破棄しているだけです。最悪の場合、彼らはエラーを隠しています(dbms_output
に書き込んだものが誰かに見られるとは決して思わないでください。 )そして、呼び出し元のコードに、成功しなかったときに何らかの操作が成功したと信じ込ませる。