シーケンスを用いたユーザー一時表の作成と利用

  プロセス毎にユニークな表を作成してデータを投入



処理が完了したら削除します

  
PROCEDURE          表作成
(
	PM_TABLE IN VARCHAR2
)
AUTHID CURRENT_USER
/**********************************************************/
/* 変数の定義 */
/**********************************************************/
AS
	WK_VALUE	VARCHAR2(2000); 
	WK_NEXTVAL NUMBER;
	TYPE EmpCurTyp IS REF CURSOR;
	emp_cv   EmpCurTyp;
	W_A NUMBER;
	W_B NUMBER;
	sql_stmt VARCHAR2(200);

/**********************************************************/
/* 処理開始 */
/**********************************************************/
BEGIN
	DBMS_OUTPUT.PUT_LINE('表作成');
	DBMS_OUTPUT.PUT_LINE(PM_TABLE);

	/***********************************************/
	/* シーケンスより値を取得 */
	/***********************************************/
	select AUTO_INCREMENT.NEXTVAL into WK_NEXTVAL from dual; 

	/***********************************************/
	/* その値を使用して CREATE 文を作成 */
	/***********************************************/
	WK_VALUE := 'CREATE TABLE "' || PM_TABLE || WK_NEXTVAL || '" (' ||
	' id NUMBER ' ||
	' , value NUMBER ' ||
	')';
	/***********************************************/
	/* CREATE 文を実行 */
	/***********************************************/
	EXECUTE IMMEDIATE WK_VALUE;

	/***********************************************/
	/* INSERT 文を作成 */
	/***********************************************/
	WK_VALUE := 'insert into "' || PM_TABLE || WK_NEXTVAL || '" values(' ||
	' 1 ' ||
	' , 1000 ' ||
	')';
	/***********************************************/
	/* INSERT 文を実行 */
	/***********************************************/
	EXECUTE IMMEDIATE WK_VALUE;

	DBMS_OUTPUT.PUT_LINE(WK_VALUE);

	/***********************************************/
	/* 動的カーソルの為の SELECT 文を作成 */
	/***********************************************/
	sql_stmt := 'SELECT * FROM "' || PM_TABLE || WK_NEXTVAL || '"';
	/***********************************************/
	/* 動的カーソルの処理 */
	/***********************************************/
	OPEN emp_cv FOR sql_stmt;
	LOOP
		FETCH emp_cv INTO W_A,W_B;
		EXIT WHEN emp_cv%NOTFOUND;
		DBMS_OUTPUT.PUT_LINE(W_A||'|'||W_B);
	END LOOP;
	CLOSE emp_cv;

	/***********************************************/
	/* 表を削除するので COMMIT で更新確定 */
	/***********************************************/
	COMMIT;

	/***********************************************/
	/* 表を削除 */
	/***********************************************/
	WK_VALUE := 'DROP TABLE "' || PM_TABLE || WK_NEXTVAL || '"';
	EXECUTE IMMEDIATE WK_VALUE;


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










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





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

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ