ロジックを組み込んだ抽出処理や更新処理などを作成する場合、複雑なSQLを作成するよりも、PLSQLを使った方が直感的にわかりやすいロジックを作ることができます。
ただ、PLSQLの構文は記憶はしていないので、ここによく使いそうなPLSQLのテンプレートを作っておいて、毎回ここからコピペできるようにしておこうと思います。
テンプレートのPLSQLはDBを汚さないようにするために、無名ブロックで定義しています。
PLSQLテンプレート
1件データ抽出及びデータ出力
SET SERVEROUTPUT ON
SET LINESIZE 32767
SET PAGESIZE 50000
SET ECHO OFF
SET FEEDBACK OFF
SET HEADING OFF
SET TAB OFF
SET TIMING OFF
SET TRIMSPOOL ON
SPOOL 1件データ抽出及びデータ出力.tsv
----------------------------------------
-- 宣言部
----------------------------------------
DECLARE
-- 変数の宣言
WRK_ID NUMBER(4);
WRK_NAME VARCHAR2(20);
----------------------------------------
-- 実行部
----------------------------------------
BEGIN
SELECT
ID
, NAME
INTO
WRK_ID
, WRK_NAME
FROM
TB_SAMPLE
WHERE
ID = 1
;
DBMS_OUTPUT.PUT_LINE(WRK_ID || CHR(9) || WRK_NAME);
----------------------------------------
-- 例外部
----------------------------------------
EXCEPTION
WHEN OTHERS THEN
-- 例外情報を出力
DBMS_OUTPUT.PUT_LINE('エラーコード:'|| SQLCODE || ' ' || 'エラーメッセージ:' || SQLERRM(SQLCODE));
END;
/
SPOOL OFF
カーソルを使ってデータ抽出及びデータ出力(パラメータなし)
SET SERVEROUTPUT ON
SET LINESIZE 32767
SET PAGESIZE 50000
SET ECHO OFF
SET FEEDBACK OFF
SET HEADING OFF
SET TAB OFF
SET TIMING OFF
SET TRIMSPOOL ON
SPOOL カーソルを使ってデータ抽出及びデータ出力(パラメータなし).tsv
----------------------------------------
-- 宣言部
----------------------------------------
DECLARE
-- カーソルの宣言
CURSOR CUR_SAMPLE IS
SELECT
ID
, NAME
FROM
TB_SAMPLE
ORDER BY
ID
;
REC_SAMPLE CUR_SAMPLE%ROWTYPE;
----------------------------------------
-- 実行部
----------------------------------------
BEGIN
OPEN CUR_SAMPLE;
LOOP
FETCH CUR_SAMPLE INTO REC_SAMPLE;
EXIT WHEN CUR_SAMPLE%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(REC_SAMPLE.ID || CHR(9) || REC_SAMPLE.NAME);
END LOOP;
CLOSE CUR_SAMPLE;
----------------------------------------
-- 例外部
----------------------------------------
EXCEPTION
WHEN OTHERS THEN
-- 例外情報を出力
DBMS_OUTPUT.PUT_LINE('エラーコード:'|| SQLCODE || ' ' || 'エラーメッセージ:' || SQLERRM(SQLCODE));
CLOSE CUR_SAMPLE;
END;
/
SPOOL OFF
カーソルを使ってデータ抽出及びデータ出力(パラメータあり)
SET SERVEROUTPUT ON
SET LINESIZE 32767
SET PAGESIZE 50000
SET ECHO OFF
SET FEEDBACK OFF
SET HEADING OFF
SET TAB OFF
SET TIMING OFF
SET TRIMSPOOL ON
SPOOL カーソルを使ってデータ抽出及びデータ出力(パラメータあり).tsv
----------------------------------------
-- 宣言部
----------------------------------------
DECLARE
-- カーソルの宣言
CURSOR CUR_SAMPLE(PARAM_ID IN NUMBER) IS
SELECT
ID
, NAME
FROM
TB_SAMPLE
WHERE
ID = PARAM_ID
ORDER BY
ID
;
REC_SAMPLE CUR_SAMPLE%ROWTYPE;
----------------------------------------
-- 実行部
----------------------------------------
BEGIN
OPEN CUR_SAMPLE(2);
LOOP
FETCH CUR_SAMPLE INTO REC_SAMPLE;
EXIT WHEN CUR_SAMPLE%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(REC_SAMPLE.ID || CHR(9) || REC_SAMPLE.NAME);
END LOOP;
CLOSE CUR_SAMPLE;
----------------------------------------
-- 例外部
----------------------------------------
EXCEPTION
WHEN OTHERS THEN
-- 例外情報を出力
DBMS_OUTPUT.PUT_LINE('エラーコード:'|| SQLCODE || ' ' || 'エラーメッセージ:' || SQLERRM(SQLCODE));
CLOSE CUR_SAMPLE;
END;
/
SPOOL OFF
カーソルを使ってデータ抽出及びデータ登録・更新・削除
SET SERVEROUTPUT ON
----------------------------------------
-- 宣言部
----------------------------------------
DECLARE
-- カーソルの宣言
CURSOR CUR_SAMPLE IS
SELECT
ID
, NAME
FROM
TB_SAMPLE
ORDER BY
ID
;
REC_SAMPLE CUR_SAMPLE%ROWTYPE;
----------------------------------------
-- 実行部
----------------------------------------
BEGIN
OPEN CUR_SAMPLE;
LOOP
FETCH CUR_SAMPLE INTO REC_SAMPLE;
EXIT WHEN CUR_SAMPLE%NOTFOUND;
-- 必要な箇所のコメントを外して使ってください
-- サンプル・INSERT
-- INSERT INTO TB_SAMPLE2 (ID, NAME) VALUES (REC_SAMPLE.ID, REC_SAMPLE.NAME);
-- サンプル・UPDATE
-- UPDATE TB_SAMPLE2 SET NAME = REC_SAMPLE.NAME WHERE ID = REC_SAMPLE.ID;
-- サンプル・DELETE
-- DELETE FROM TB_SAMPLE2 WHERE ID = REC_SAMPLE.ID;
-- サンプル・MERGE
-- MERGE INTO TB_SAMPLE2 T1
-- USING
-- ( SELECT REC_SAMPLE.ID AS ID, REC_SAMPLE.NAME AS NAME FROM DUAL) T2
-- ON (T1.ID = T2.ID)
-- WHEN NOT MATCHED THEN
-- INSERT (ID, NAME) VALUES (T2.ID, T2.NAME)
-- ;
END LOOP;
CLOSE CUR_SAMPLE;
----------------------------------------
-- 例外部
----------------------------------------
EXCEPTION
WHEN OTHERS THEN
-- 例外情報を出力
DBMS_OUTPUT.PUT_LINE('エラーコード:'|| SQLCODE || ' ' || 'エラーメッセージ:' || SQLERRM(SQLCODE));
CLOSE CUR_SAMPLE;
END;
/
