PL/SQL で INSERT を行なう
テーブル定義
以下のようなレイアウトの利用者マスタ表を使用して PL/SQL のサンプルを作成する。
日本語名 | カラム名 | 入力必須 | データの型と大きさ | 省略時 |
利用者ID | USER_ID | YES | 4 バイト以内の文字列 | |
部門 | DEPT_NO | NO | 4 バイト以内の文字列 | |
利用者名 | USER_NAME | NO | 32 バイト以内の文字列 | |
作成日 | CREATED_ON | NO | 日付(日+時間) | SYSDATE |
更新日 | MODIFIED_ON | NO | 日付(日+時間) | |
DDL は 以下のとおり。
CREATE TABLE RIVUS.USER_MASTER
(
USER_ID VARCHAR2(4) NOT NULL,
DEPT_NO VARCHAR2(4),
USER_NAME VARCHAR2(32),
CREATED_ON DATE DEFAULT SYSDATE,
MODIFIED_ON DATE
);
PL/SQL で INSERT を実行する
SQLPlus のコマンドラインから SQL を実行するのと変わりなく記述することができる。
SQL*Plus の場合には実行の前に SET SERVEROUTPUT ON を実行しておく。
CREATE OR REPLACE PROCEDURE RIVUS.STEP01_INSERT
IS
BEGIN
INSERT INTO USER_MASTER (
USER_ID, DEPT_NO, USER_NAME, CREATED_ON, MODIFIED_ON
) VALUES (
'0020', '1001',
'小泉 純一',
DEFAULT,
NULL
) ;
DBMS_OUTPUT.PUT_LINE('インサートした件数は' || SQL%ROWCOUNT || '件です。');
COMMIT ;
DBMS_OUTPUT.PUT_LINE('COMMIT(SQL)後の ROWCOUNT は' || SQL%ROWCOUNT || 'です。');
END;
/
-- このプロシージャを実行してみる。
CALL STEP01_INSERT() ;
インサートした件数は1件です。
コミット(SQL)実行後の ROWCOUNT は0です。
コールが完了しました。
ソースコードの SQL%ROWCOUNT は 暗黙カーソル SQL と、その属性 ROWCOUNT である。
この PL/SQL のソースコード内の INSERT 文はPL/SQL エンジンで暗黙カーソルに変換されており、
自動的に カーソル のオープン〜クローズ処理までが行なわれている。
PL/SQL の INSERT で RETURNING 句を使用する
RETURNING を使用することで INSERT した結果を SELECT することなく取得することができる。
この例ではデフォルト制約によって自動的に作成日が設定されている CREATED_ON 項目を取得している。
CREATE OR REPLACE PROCEDURE RIVUS.STEP02_INSERT
IS
vUser USER_MASTER%ROWTYPE;
BEGIN
INSERT INTO USER_MASTER (
USER_ID, DEPT_NO, USER_NAME, CREATED_ON, MODIFIED_ON
) VALUES (
'0021', '1001',
'小泉 純一',
DEFAULT,
NULL
)
RETURNING USER_ID, DEPT_NO, USER_NAME, CREATED_ON, MODIFIED_ON INTO vUser;
DBMS_OUTPUT.PUT_LINE('インサートした件数は' || SQL%ROWCOUNT || '件です。');
COMMIT ;
DBMS_OUTPUT.PUT_LINE('COMMIT(SQL)後の ROWCOUNT は' || SQL%ROWCOUNT || 'です。');
DBMS_OUTPUT.PUT_LINE('インサートした日付 は' || vUser.CREATED_ON || 'です。');
END;
/
SQL INSERT 関連事項