動的SQLは、実行時にストアド プロシージャ内からコンパイルおよび実行することにより、SQL文を起動する手段で、 一部の例外を除いて、DDL、DML、またはDCL文をストアド プロシージャ内で動的SQLとして起動することができます。
動的SQL文
動的SQL文とは、実行ごとにリクエスト テキストが変わる可能性のある文のことです。この文によって、ストアド プロシージャ定義の可用性と簡潔性が向上します。
結果セットを返さない動的SQLの呼び出し
- EXECUTE文またはEXECUTE IMMEDIATE文。
- CALL文。次に示すCALL文を使用すると、結果セットを返さないない動的SQLを、ストアド プロシージャ内でセットアップして、呼び出すことができます。
構文要素 指定内容 dbc.SysExecSQL 文字列の使用目的。 - 動的SQLの起動
- ユーザーの権利の検証
現在のデフォルト データベースがDBCでないかぎり、修飾用のデータベース名DBCを指定しなければなりません。
string_expression SQL文を作成するための任意の有効な文字列式。 string_expressionには、以下を入れることができます。- 文字列リテラル
- ステータス変数
- ローカル変数
- 入力(INおよびINOUT)パラメータ
- FORループ別名
例: EXECUTE IMMEDIATE文での動的SQL文の使用
次の例では、結果セットを返さない動的SQL文を、ストアド プロシージャ内で使用する方法を示しています。この例では、EXECUTE IMMEDIATE文を使用します。
CREATE PROCEDURE new_sales_table (my_table VARCHAR(30), my_database VARCHAR(30)) BEGIN DECLARE sales_columns VARCHAR(128) DEFAULT '(item INTEGER, price DECIMAL(8,2) , sold INTEGER)' ; DECLARE sqlstr VARCHAR(500); SET sqlstr = 'CREATE TABLE ' || my_database || '.' || my_table || sales_columns ; EXECUTE IMMEDIATE sqlstr; END;
例: CALL文での動的SQL文の使用
次の例では、結果セットを返さない動的SQL文を、ストアド プロシージャ内で使用する方法を示しています。この例では、CALL文を使用します。
CREATE PROCEDURE new_sales_table (my_table VARCHAR(30), my_database VARCHAR(30)) BEGIN DECLARE sales_columns VARCHAR(128) DEFAULT '(item INTEGER, price DECIMAL(8,2) , sold INTEGER)' ; CALL DBC.SysExecSQL('CREATE TABLE ' || my_database || '.' || my_table || sales_columns) ; END;
結果セットを返す動的SQLの呼び出し
動的形式のDECLARE CURSOR (ストアド プロシージャ形式)文を使用すると、結果セットを返す動的SQLを、ストアド プロシージャ内から呼び出すことができます。
例: 結果セットを返すストアド プロシージャ内での動的SQL文の使用
以下の例は、結果セットを返す動的SQL文を、ストアド プロシージャ内で使用する方法を示しています。このプロシージャではWITH RETURN文を使用していないことに注意してください。
CREATE PROCEDURE GetEmployeeSalary (IN EmpName VARCHAR(100), OUT Salary DEC(10,2)) BEGIN DECLARE SqlStr VARCHAR(1000); DECLARE C1 CURSOR FOR S1; SET SqlStr = 'SELECT Salary FROM EmployeeTable WHERE EmpName = ?'; PREPARE S1 FROM SqlStr; OPEN C1 USING EmpName; FETCH C1 INTO Salary; CLOSE C1; END;
動的に使用できないSQL文
- ALTER PROCEDURE
- CALL
- CREATE PROCEDURE
- DATABASE
- EXPLAIN
- HELP(すべての形式)
- OPEN
- PREPARE
- REPLACE PROCEDURE
- SELECT
- SELECT … INTO
- SET ROLE
- SET SESSION ACCOUNT
- SET SESSION COLLATION
- SET SESSION DATEFORM
- SET TIME ZONE
- SHOW
- CLOSE、FETCH、およびOPENなどのカーソル文
動的SQL文内で作成または参照されるオブジェクトの所有権
ストアド プロシージャ内で参照されるか、または動的SQL文を使って作成されるオブジェクトに関するルールは、他の文中で参照されるオブジェクトのルールと同じです。
動的SQL文の使用上のルール
動的SQL文は、コンパイル時(つまり、ストアド プロシージャの作成時)には検査されません。 検査は、ストアド プロシージャの実行時にのみ行なわれます。
BEGIN REQUEST … END REQUESTブロック内の動的SQLリクエストで複文リクエストを指定できます。そうしない場合は、ストアド プロシージャの実行時にエラー5568 (SQL statement is not supported within a stored procedure)が報告されます。
動的に作成されたSQL文では、末尾のセミコロン文字はオプションです。
- NULLの文にする。
- コメントを含める(Teradata DatabaseスタイルとANSIスタイルの両方が可能)。
- 改行文字や他の埋め込み文字を含める。
ストアド プロシージャ内では、動的SQLとして使用できるのはDDL COMMENT文だけです。データベース オブジェクト、テーブルの列、およびパラメータのコメントを取り出すのにDML COMMENT文を指定することはできません。
ストアド プロシージャ内で動的SQLとして使用するCREATE DATABASE文またはCREATE USER文には、FROM句が入っていなければなりません。
CALL DBC.SysExecSQL文は、ストアド プロシージャ内で何回使っても差し支えありません。動的SQLの文字列式では、呼び出しごとに1つのSQL文だけを指定できます。
各動的SQLリクエスト(string_expression)のサイズは、32000文字を超えてはなりません。
CALL DBC.SysExecSQL文を使用するのに、特別な権限は必要ありません。
関連トピック
参照されるオブジェクトまたは動的SQL文で作成されるオブジェクトの詳細については、ストアド プロシージャで作成されたオブジェクトの所有権を参照してください。