INSERT¶
SQL言語で使用可能な INSERT コマンドは、SPLプログラムでも使用できます。
SPL言語の式は、SQLの INSERT コマンドで式を使用できる場所であればどこでも使用できます。したがって、SPL変数およびパラメーターを使用して、挿入操作に値を提供できます。
以下は、呼び出し側プログラムから渡されたデータを使用して、新しい従業員の挿入を実行する手順の例です。
CREATE OR REPLACE PROCEDURE emp_insert (
p_empno IN emp.empno%TYPE,
p_ename IN emp.ename%TYPE,
p_job IN emp.job%TYPE,
p_mgr IN emp.mgr%TYPE,
p_hiredate IN emp.hiredate%TYPE,
p_sal IN emp.sal%TYPE,
p_comm IN emp.comm%TYPE,
p_deptno IN emp.deptno%TYPE
)
IS
BEGIN
INSERT INTO emp VALUES (
p_empno,
p_ename,
p_job,
p_mgr,
p_hiredate,
p_sal,
p_comm,
p_deptno);
DBMS_OUTPUT.PUT_LINE('Added employee...');
DBMS_OUTPUT.PUT_LINE('Employee # : ' || p_empno);
DBMS_OUTPUT.PUT_LINE('Name : ' || p_ename);
DBMS_OUTPUT.PUT_LINE('Job : ' || p_job);
DBMS_OUTPUT.PUT_LINE('Manager : ' || p_mgr);
DBMS_OUTPUT.PUT_LINE('Hire Date : ' || p_hiredate);
DBMS_OUTPUT.PUT_LINE('Salary : ' || p_sal);
DBMS_OUTPUT.PUT_LINE('Commission : ' || p_comm);
DBMS_OUTPUT.PUT_LINE('Dept # : ' || p_deptno);
DBMS_OUTPUT.PUT_LINE('----------------------');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('OTHERS exception on INSERT of employee # '
|| p_empno);
DBMS_OUTPUT.PUT_LINE('SQLCODE : ' || SQLCODE);
DBMS_OUTPUT.PUT_LINE('SQLERRM : ' || SQLERRM);
END;
例外が発生した場合、プロシージャで行われたすべてのデータベース変更は自動的にロールバックされます。この例では、 WHEN OTHERS 句のある EXCEPTION セクションがすべての例外をキャッチします。2つの変数が表示されます。 SQLCODE は、発生した特定の例外を識別する番号です。 SQLERRM はエラーを説明するテキストメッセージです。例外処理の詳細については、ExceptionHandling を参照してください。
以下は、この手順が実行されたときの出力を示しています。
EXEC emp_insert(9503,'PETERSON','ANALYST',7902,'31-MAR-05',5000,NULL,40);
Added employee...
Employee # : 9503
Name : PETERSON
Job : ANALYST
Manager : 7902
Hire Date : 31-MAR-05 00:00:00
Salary : 5000
Dept # : 40
----------------------
SELECT * FROM emp WHERE empno = 9503;
empno | ename | job | mgr | hiredate | sal | comm | deptno
-------+--------+--------+------+-------------------+---------+------+-------
9503 |PETERSON| ANALYST| 7902 | 31-MAR-05 00:00:00| 5000.00 | | 40
(1 row)
注釈
INSERT コマンドは FORALL ステートメントに含めることができます。 FORALL ステートメントを使用すると、1つの INSERT コマンドで、1つ以上のコレクションで提供される値から複数の行を挿入できます。 FORALL ステートメントの詳細については、:ref:「FORALLステートメントの使用<using_the_forall_statement>」を参照してください。