Oracle のストアードプロシージャでテストデータを作成する

  DBMS_RANDOM.VALUE の利用



【Oracle ドキュメント】DBMS_RANDOM

  
CREATE or REPLACE PROCEDURE GET_DATA_LOOP

/**********************************************************/
/* 変数の定義 */
/**********************************************************/
AS
	RET_VALUE	VARCHAR2(2000);
	WK_VALUE	VARCHAR2(2000);
	CNT_MAX		NUMBER;

-- *********************************************************
-- 内部プロシージャ( データ作成 )
-- *********************************************************
PROCEDURE INSERT_DATA( idx in NUMBER )
AS
	TARGET_CODE VARCHAR2(4);
	TARGET_NAME VARCHAR2(50);
	TARGET_NAME_SEED VARCHAR2(100) := '山川田海岡';
	TARGET_IDX NUMBER;
BEGIN

	-- 社員コード作成
	TARGET_CODE	:= LTRIM(TO_CHAR( idx, '0000' ));

	-- 社員氏名作成のヒント
	TARGET_IDX := DBMS_RANDOM.VALUE(1,5);
	TARGET_NAME := SUBSTR(TARGET_NAME_SEED,TARGET_IDX,1);
	TARGET_IDX := DBMS_RANDOM.VALUE(1,5);
	TARGET_NAME := TARGET_NAME || SUBSTR(TARGET_NAME_SEED,TARGET_IDX,1);

	INSERT INTO "社員データ" 
		(
			"社員コード"
			,"氏名"
		)
	VALUES (
		TARGET_CODE
		,TARGET_NAME
	);

END;

/**********************************************************/
/* 処理開始 */
/**********************************************************/
BEGIN
	DBMS_OUTPUT.PUT_LINE('デバッグ:開始');

	-- ****************************************************
	-- 社員マスタと同一フォーマットの
	-- 社員テーブルをクリア
	-- ****************************************************
	WK_VALUE := 'TRUNCATE TABLE "社員データ"';
	EXECUTE IMMEDIATE WK_VALUE;

	-- ****************************************************
	-- ループを無条件に100回実行する
	-- ****************************************************
	CNT_MAX := 1000;
	FOR i IN 1..CNT_MAX LOOP
		INSERT_DATA( i );
	END LOOP;

/**********************************************************/
/* 一番外側のブロックの例外処理 */
/**********************************************************/
EXCEPTION
	WHEN OTHERS THEN
		DBMS_OUTPUT.PUT_LINE('例外発生:'||SQLCODE||':'||SQLERRM);
END;
/
  



  さらに詳細なデータの作成



カンマ区切りを分解するプロシージャ を使用しています

  
CREATE or REPLACE PROCEDURE GET_DATA_LOOP

/**********************************************************/
/* 変数の定義 */
/**********************************************************/
AS
	RET_VALUE	VARCHAR2(2000);
	WK_VALUE	VARCHAR2(2000);
	CNT_MAX		NUMBER;

	/************************************************/
	/* 名前を作成する為の変数 */
	/************************************************/
	TARGET_NAME_SEED VARCHAR2(100) := '山川森鈴木高田本多村吉岡松丸杉浦中尾安原野内';
	TARGET_KANA_SEED VARCHAR2(200);
	TARGET_NAME2_SEED VARCHAR2(100) := '和元雅正由克友浩春冬洋輝';
	TARGET_KANA2_SEED VARCHAR2(100) := 'カズ,モト,マサ,マサ,ヨシ,カツ,トモ,ヒロ,ハル,フユ,ヒロ,テル';
	TARGET_NAME3_SEED VARCHAR2(100) := '男也一行樹之';
	TARGET_KANA3_SEED VARCHAR2(100) := 'オ,ヤ,カズ,ユキ,キ,ユキ';
	TARGET_NAME4_SEED VARCHAR2(100) := '子代美恵';
	TARGET_KANA4_SEED VARCHAR2(100) := 'コ,ヨ,ミ,エ';
	TARGET_ARRAY_1 DBMS_UTILITY.UNCL_ARRAY;
	TARGET_LEN_1 BINARY_INTEGER;
	TARGET_ARRAY_2 DBMS_UTILITY.UNCL_ARRAY;
	TARGET_LEN_2 BINARY_INTEGER;
	TARGET_ARRAY_3 DBMS_UTILITY.UNCL_ARRAY;
	TARGET_LEN_3 BINARY_INTEGER;
	TARGET_ARRAY_4 DBMS_UTILITY.UNCL_ARRAY;
	TARGET_LEN_4 BINARY_INTEGER;

-- *********************************************************
-- 内部プロシージャ( データ作成 )
-- *********************************************************
PROCEDURE INSERT_DATA( idx in NUMBER )
AS
	TARGET_CODE VARCHAR2(4);
	TARGET_SYOZOKU VARCHAR2(4);
	TARGET_KANRISYA VARCHAR2(4);
	TARGET_BIRTHDAY DATE;
	TARGET_SAL NUMBER(15,0);

	/************************************************/
	/* 名前を作成する為の変数 */
	/************************************************/
	TARGET_NAME VARCHAR2(50);
	/* 文字列の長さをセット */
	TARGET_NAME_LEN NUMBER(2,0) := LENGTH(TARGET_NAME_SEED);
	TARGET_IDX NUMBER;
	TARGET_KANA VARCHAR2(50);
	TARGET_SEX NUMBER(1,0);

BEGIN

	/************************************************/
	/* 社員コード作成 */
	/************************************************/
	TARGET_CODE := LTRIM(TO_CHAR( idx, '0000' ));

	/************************************************/
	/* 社員氏名作成 */
	/************************************************/
	/* 姓の1文字目 */
	TARGET_IDX	:= DBMS_RANDOM.VALUE(1,TARGET_NAME_LEN);
	TARGET_NAME := SUBSTR(TARGET_NAME_SEED,TARGET_IDX,1);
	TARGET_KANA := TARGET_ARRAY_1(TARGET_IDX);

	/* 姓の2文字目 */
	TARGET_IDX	:= DBMS_RANDOM.VALUE(1,TARGET_NAME_LEN);
	TARGET_NAME := TARGET_NAME || SUBSTR(TARGET_NAME_SEED,TARGET_IDX,1);
	TARGET_KANA := TARGET_KANA || TARGET_ARRAY_1(TARGET_IDX);

	/* 姓と名の間のスペース */
	TARGET_NAME := TARGET_NAME || ' ';
	TARGET_KANA := TARGET_KANA || ' ';

	/* 名の1文字目 */
	TARGET_NAME_LEN := LENGTH(TARGET_NAME2_SEED);
	TARGET_IDX	:= DBMS_RANDOM.VALUE(1,TARGET_NAME_LEN);
	TARGET_NAME := TARGET_NAME || SUBSTR(TARGET_NAME2_SEED,TARGET_IDX,1);
	TARGET_KANA := TARGET_KANA || TARGET_ARRAY_2(TARGET_IDX);

	/* 性別の決定 */
	TARGET_SEX	:= DBMS_RANDOM.VALUE(0,1);

	/* 男性名 */
	if TARGET_SEX = 0 then
		/* 名の2文字目 */
		TARGET_NAME_LEN := LENGTH(TARGET_NAME3_SEED);
		TARGET_IDX	:= DBMS_RANDOM.VALUE(1,TARGET_NAME_LEN);
		TARGET_NAME := TARGET_NAME || SUBSTR(TARGET_NAME3_SEED,TARGET_IDX,1);
		TARGET_KANA := TARGET_KANA || TARGET_ARRAY_3(TARGET_IDX);
	/* 女性名 */
	else
		/* 名の2文字目 */
		TARGET_NAME_LEN := LENGTH(TARGET_NAME4_SEED);
		TARGET_IDX	:= DBMS_RANDOM.VALUE(1,TARGET_NAME_LEN);
		TARGET_NAME := TARGET_NAME || SUBSTR(TARGET_NAME4_SEED,TARGET_IDX,1);
		TARGET_KANA := TARGET_KANA || TARGET_ARRAY_4(TARGET_IDX);
	end if;

	/************************************************/
	/* 所属コード作成 */
	/************************************************/
	TARGET_SYOZOKU := LTRIM(TO_CHAR( DBMS_RANDOM.VALUE(1,3), '0000' ));

	/************************************************/
	/* 管理者作成 */
	/************************************************/
	if TARGET_CODE <= 10 then
		TARGET_KANRISYA := NULL;
	else
		loop
			TARGET_KANRISYA := 
			LTRIM(TO_CHAR( DBMS_RANDOM.VALUE(11,CNT_MAX), '0000' ));
			exit when TARGET_KANRISYA != TARGET_CODE;
		end loop;
	end if;

	/************************************************/
	/* 誕生日作成 */
	/************************************************/
	TARGET_BIRTHDAY := SYSDATE;
	TARGET_BIRTHDAY := TARGET_BIRTHDAY - DBMS_RANDOM.VALUE(20,30)*365;
	TARGET_BIRTHDAY := TARGET_BIRTHDAY + DBMS_RANDOM.VALUE(1,365);
	TARGET_BIRTHDAY := TRUNC(TARGET_BIRTHDAY);
	
	/************************************************/
	/* 給与作成 */
	/************************************************/
	TARGET_SAL := TRUNC(DBMS_RANDOM.VALUE(16,50))*10000;

	INSERT INTO "社員データ"
		(
			"社員コード"
			,"氏名"
			,"フリガナ"
			,"所属"
			,"性別"
			,"給与"
			,"管理者"
			,"生年月日"
		)
	VALUES (
		TARGET_CODE
		,TARGET_NAME
		,TARGET_KANA
		,TARGET_SYOZOKU
		,TARGET_SEX
		,TARGET_SAL
		,TARGET_KANRISYA
		,TARGET_BIRTHDAY
	);

END;

/**********************************************************/
/* 処理開始 */
/**********************************************************/
BEGIN
	DBMS_OUTPUT.PUT_LINE('デバッグ:開始');

	/************************************************/
	/* 社員マスタと同一フォーマットの */
	/* 社員テーブルをクリア */
	/************************************************/
	WK_VALUE := 'TRUNCATE TABLE "社員データ"';
	EXECUTE IMMEDIATE WK_VALUE;

	/************************************************/
	/* カナ用の配列としてのSEEDを作成する */
	/************************************************/
	TARGET_KANA_SEED := 'ヤマ,カワ,モリ,スズ,キ,タカ,タ,モト,タ,ムラ,ヨシ,オカ';
	TARGET_KANA_SEED := TARGET_KANA_SEED || ',マツ,マル,スギ,ウラ,ナカ,オ,ヤス,ハラ,ノ,ウチ';

	COMMA_TO_TOKEN(TARGET_KANA_SEED,TARGET_LEN_1,TARGET_ARRAY_1); 
	COMMA_TO_TOKEN(TARGET_KANA2_SEED,TARGET_LEN_2,TARGET_ARRAY_2); 
	COMMA_TO_TOKEN(TARGET_KANA3_SEED,TARGET_LEN_3,TARGET_ARRAY_3); 
	COMMA_TO_TOKEN(TARGET_KANA4_SEED,TARGET_LEN_4,TARGET_ARRAY_4); 

	/************************************************/
	/* ループを無条件に100回実行する */
	/************************************************/
	CNT_MAX := 1000;
	FOR i IN 1..CNT_MAX LOOP
		INSERT_DATA( i );
	END LOOP;

/**********************************************************/
/* 一番外側のブロックの例外処理 */
/**********************************************************/
EXCEPTION
	WHEN OTHERS THEN
		DBMS_OUTPUT.PUT_LINE('例外発生:'||SQLCODE||':'||SQLERRM);
END;
/
  











  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ