INSERT文を手作業で作ろうとすると、把握していないテーブルや、カラムが多いテーブルだと、INSERT文を作成するのに結構手間がかかると思います。
スキーマ名とテーブル名を指定すれば、自動でサンプル用のINSERT文を生成してくれるPLSQLを作ったので、使ってもらえると幸いです。
自動作成されたINSERT文のVALUESの値は自由に変更してもらえればと思います。
テーブル定義
TB_SAMPLEの定義は下記の通りです。
SQL> DESC TB_SAMPLE; 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- ID NOT NULL NUMBER(10) NAME VARCHAR2(600 CHAR) REGIST_DATE DATE REGIST_TIMESTAMP TIMESTAMP(6) BLOB_DATA BLOB
INSERT文自動生成PLSQL
INSERT文を自動生成するPLSQLです。
宣言部のWK_OWNERにはスキーマ名を、WK_TABLE_NAMEにはテーブル名を指定して下さい。
カラム名と型によってINSERT文のVALUESの値を設定するようにしています。
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
----------------------------------------
-- 宣言部
----------------------------------------
DECLARE
-- 対象スキーマ名を指定して下さい
WK_OWNER VARCHAR2(30) := 'TEST';
-- 対象テーブル名を指定して下さい
WK_TABLE_NAME VARCHAR2(30) := 'TB_SAMPLE';
-- カラム名の文字列連結用
WK_COLUMNS VARCHAR2(32767);
-- VALUESの文字列連結用
WK_VALUES VARCHAR2(32767);
-- DATA型の初期値
WK_DATE VARCHAR2(21) := TO_CHAR(SYSDATE, 'YYYY/MM/DD HH24:MI:SS');
-- TIMESTAMP型の初期値
WK_TIMESTAMP VARCHAR2(28) := TO_CHAR(SYSTIMESTAMP, 'YYYY/MM/DD HH24:MI:SS.FF6');
-- カーソルの宣言
CURSOR CUR_SAMPLE(IN_OWNER IN VARCHAR2, IN_TABLE_NAME IN VARCHAR2) IS
SELECT
COLUMN_NAME
, DATA_TYPE
FROM
ALL_TAB_COLUMNS
WHERE
OWNER = IN_OWNER
AND TABLE_NAME = IN_TABLE_NAME
ORDER BY
COLUMN_ID
;
REC CUR_SAMPLE%ROWTYPE;
----------------------------------------
-- 実行部
----------------------------------------
BEGIN
-- テーブル定義情報を取得
OPEN CUR_SAMPLE(WK_OWNER, WK_TABLE_NAME);
LOOP
FETCH CUR_SAMPLE INTO REC;
EXIT WHEN CUR_SAMPLE%NOTFOUND;
-- INSERT文の列名を生成
WK_COLUMNS := WK_COLUMNS || REC.COLUMN_NAME || ', ';
-- VALUESの値をサンプル値で生成
CASE
-- 数値型
WHEN REC.DATA_TYPE = 'NUMBER' THEN
WK_VALUES := WK_VALUES || REC.COLUMN_NAME || ', ';
-- DATE型
WHEN REC.DATA_TYPE = 'DATE' THEN
WK_VALUES := WK_VALUES || 'TO_DATE(''' || WK_DATE || ''', ''YYYY/MM/DD HH24:MI:SS''), ';
-- TIMESTAMP型
WHEN REC.DATA_TYPE LIKE '%TIMESTAMP%' THEN
WK_VALUES := WK_VALUES || 'TO_TIMESTAMP(''' || WK_TIMESTAMP || ''', ''YYYY/MM/DD HH24:MI:SS.FF6''), ';
-- BLOB型
WHEN REC.DATA_TYPE = 'BLOB' THEN
WK_VALUES := WK_VALUES || 'UTL_RAW.CAST_TO_RAW(''' || REC.COLUMN_NAME || '''), ';
-- それ以外
ELSE
WK_VALUES := WK_VALUES || '''' || REC.COLUMN_NAME || ''', ';
END CASE;
END LOOP;
CLOSE CUR_SAMPLE;
DBMS_OUTPUT.PUT_LINE('INSERT INTO ' || WK_TABLE_NAME || ' (' || RTRIM(WK_COLUMNS, ', ') || ') VALUES (' || RTRIM(WK_VALUES, ', ') || ');');
----------------------------------------
-- 例外部
----------------------------------------
EXCEPTION
WHEN OTHERS THEN
-- 例外情報を出力
DBMS_OUTPUT.PUT_LINE('エラーコード:'|| SQLCODE || ' ' || 'エラーメッセージ:' || SQLERRM(SQLCODE));
CLOSE CUR_SAMPLE;
END;
/
自動生成したINSERT文
自動生成したINSERT文になります。VALUESの値は仮で設定しているので、自分で自由に編集して使って下さい。
INSERT INTO TB_SAMPLE (ID, NAME, REGIST_DATE, REGIST_TIMESTAMP, BLOB_DATA) VALUES (9, 'NAME', TO_DATE('2022/07/30 16:15:51', 'YYYY/MM/DD HH24:MI:SS'), TO_TIMESTAMP('2022/07/30 16:15:51.365000', 'YYYY/MM/DD HH24:MI:SS.FF6'), UTL_RAW.CAST_TO_RAW('BLOB_DATA'));