ソース掲示板




すべてから検索

キーワード   条件 表示 現行ログ 過去ログ トピックス 名前 本文
Oracle 動的SQL
日時: 2013/05/10 11:06
名前: lightbox



EXECUTE IMMEDIATE文

SQLデータ定義文(CREATEなど)、データ制御文(GRANTなど)またはセッション制御文(ALTER SESSIONなど)を実行する場合、INSERT文、UPDATE文およびDELETE文とは異なり、これらの文はPL/SQLプログラム内に直接含めることができません。
デフォルトでは、ストアド・プロシージャおよびSQLメソッドは、現行ユーザーの権限ではなく所有者の権限で実行します
以下の処理では、テーブルを作成していますがそのままでは権限エラーとなるので、AUTHID 句を 使用しています。また、識別子にバインド変数は使用できません
/*
/*==========================================================
 動的表作成
===========================================================*/
CREATE or REPLACE PROCEDURE 表作成
	(
	PM_TABLE	IN	VARCHAR2
	)
	AUTHID CURRENT_USER AS
 
	W_SQL	VARCHAR2(1000);

BEGIN
/*==========================================================
 処理
===========================================================*/
W_SQL := 'CREATE TABLE ' || PM_TABLE || '(';
W_SQL := W_SQL || 'コード VARCHAR2(4),';
W_SQL := W_SQL || '名称 VARCHAR2(40),';
W_SQL := W_SQL || 'primary key(コード)';
W_SQL := W_SQL || ')';

EXECUTE IMMEDIATE W_SQL;

/*==========================================================
 終了処理
===========================================================*/

END 表作成;
/
↓この PL/SQL は作成されない
/*
/*==========================================================
 動的表作成
===========================================================*/
CREATE or REPLACE PROCEDURE 表作成
	(
	PM_TABLE	IN	VARCHAR2
	)
	AS
 
BEGIN
/*==========================================================
 処理
===========================================================*/
CREATE TABLE 名称マスタ (
	コード VARCHAR2(4),
	名称 VARCHAR2(40),
	primary key(コード)
);

/*==========================================================
 終了処理
===========================================================*/

END 表作成;
/
メンテナンス


日時: 2013/05/10 11:06
名前: lightbox