ストアド プロシージャでの動的SQLの使用 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLストアド プロシージャおよび埋め込みSQL

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Published
2021年7月
Language
日本語
Last Update
2021-09-23
dita:mapPath
ja-JP/vqj1592443206677.ditamap
dita:ditavalPath
ja-JP/wrg1590696035526.ditaval
dita:id
B035-1148
Product Category
Software
Teradata Vantage

動的SQLは、実行時にストアド プロシージャ内からコンパイルおよび実行することにより、SQL文を起動する手段で、 一部の例外を除いて、DDL、DML、またはDCL文をストアド プロシージャ内で動的SQLとして起動することができます。

動的SQL文

動的SQL文とは、実行ごとにリクエスト テキストが変わる可能性のある文のことです。この文によって、ストアド プロシージャ定義の可用性と簡潔性が向上します。

結果セットを返さない動的SQLの呼び出し

結果セットを返さない動的SQLは、次の文のいずれかでストアド プロシージャ内から呼び出すことができます。
  • EXECUTE文またはEXECUTE IMMEDIATE文。
  • 次のCALL文を実行します。

CALL文の構文

CALL dbc.SysExecSQL ( string_expression ) [;]

構文要素

dbc
現在のデフォルト データベースがDBCでないかぎり、修飾用のデータベース名DBCを指定しなければなりません。
SysExecSQL
文字列の使用目的。
  • 動的SQLの起動
  • ユーザーの権利の検証
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文

結果セットを返さないストアド プロシージャを記述するときには、次に示す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ステートメントは、SELECTだけです。

動的SQL文内で作成または参照されるオブジェクトの所有権

ストアド プロシージャ内で参照されるか、または動的SQL文を使って作成されるオブジェクトに関するルールは、他の文中で参照されるオブジェクトのルールと同じです。

動的SQL文の使用上のルール

動的SQL文は、コンパイル時(つまり、ストアド プロシージャの作成時)には検査されません。 検査は、ストアド プロシージャの実行時にのみ行なわれます。

ストアド プロシージャの作成者が直接所有者ではなく、OWNER SQL SECURITYオプションが指定されていると、システムはユーザーがCREATE OWNER PROCEDURE権限を持っているか、そうでなければコンパイル エラーが報告されていないか、プロシージャが作成されていないかを確認します。

BEGIN REQUEST … END REQUESTブロック内の動的SQLリクエストで複文リクエストを指定できます。そうしない場合は、ストアド プロシージャの実行時にエラー5568 (SQL statement is not supported within a stored procedure)が報告されます。

動的に作成されたSQL文では、末尾のセミコロン文字はオプションです。

動的に構築されたSQL文では以下のことが可能です。
  • NULLの文にする。
  • コメントを含める(データベース スタイルと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文で作成されるオブジェクトの詳細については、ストアド プロシージャで作成されたオブジェクトの所有権を参照してください。