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>」を参照してください。