16.20 - ストアド プロシージャの語彙 - Teradata Vantage NewSQL Engine

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

prodname
Teradata Database
Teradata Vantage NewSQL Engine
vrm_release
16.20
category
プログラミング リファレンス
featnum
B035-1148-162K-JPN

名前

ストアド プロシージャの名前、ならびにストアド プロシージャ パラメータ、ローカル変数、ラベル、FORループ相関名および列、カーソル、およびFORループ変数は、有効なTeradata SQL名(または識別子)でなければなりません。

ストアド プロシージャに名前を付ける際には、データベース オブジェクトの命名に適用されるすべてのルールが適用されます。

ストアド プロシージャ内の各種の名前には以下のルールが適用されます。

名前 固有性を求められる場所
相関または列 FOR繰返し文、またはDECLARE CURSOR文。

入れ子であるかどうかに関係なく、ストアド プロシージャ内のFOR文には、同じ相関名または列名を再使用できます。

相関名や列名には、FOR文中のFORループ変数やカーソル名と同じ名前を使用できます。

カーソル 入れ子のFOR文。

カーソルの名前には、FOR文中のFORループ変数や相関名または列名と同じ名前を使用することができます。

DECLARE CURSORを使用して定義されたカーソルの場合、カーソル名は、そのカーソルが宣言される複合文の中で固有なものである必要があります。

FORループ変数 入れ子のFORループ文。

FORループ変数の名前には、FOR文中のカーソル名や相関名または列名と同じ名前を使用できます。

ラベル 入れ子の繰返し文または入れ子のBEGIN…END文のグループ。繰返し文のラベル名は、ストアド プロシージャ内の他の入れ子でない繰返し文の構成や、入れ子でないBEGIN…END文で再使用できます。

ラベル名には専用の名前領域があるため、ローカル変数やパラメータに使用される他の識別子と衝突することはありません。

ローカル変数 そのローカル変数が宣言されるBEGIN…END複合文。
パラメータ ストアド プロシージャ。

例えば、同じストアド プロシージャ内のローカル変数に対してパラメータ名を重複して使用することはできません。

ストアド プロシージャ データベース。これは、テーブル、マクロ、ビュー、およびトリガーの名前領域に帰属するからです。

キーワード

ストアド プロシージャでは、キーワード内の大文字小文字を区別しません。通常は、大文字と小文字のどちらを使用してもかまいません。

構文を読みやすくするため、各構文要素の間に1つ以上のブランク スペース文字を含めることができます。ただし、連続する複数のブランク スペース文字は1つのスペースとして扱われます。

リテラル

ストアド プロシージャでは、Teradata Databaseがサポートしている、制御文を含むSQL文のテキストに直接値を指定するためのリテラルがすべて有効です。

ローカル変数

ストアド プロシージャのBEGIN…END複合文における変数の宣言文では、Teradata Databaseがサポートしているすべてのデータ型のローカル変数を指定できます。

各複合文には複数の変数の宣言を設けることができ、また、それぞれのDECLARE文には複数のローカル変数を含めることができます。

ローカル変数は任意の有効なデータ型を持つことができます。

制御文以外のSQL文でローカル変数を指定する場合は、接頭部としてコロン文字(:)を付ける必要はありません。ローカル変数の接頭部のコロンは引き続きサポートされていますが、お勧めするものではありません。

ローカル変数の接頭部としてコロン文字を付けない場合、変数名と列名を同じにしないでください。

SQL変数名と列名とで同じ識別子がSQL文に含まれる場合、Teradataはその識別子を列名と解釈します。これを防ぐには、列名と同じSQL変数の識別子を複合文名で修飾してください。

ローカル変数の名前に、ステータス変数用に予約されている以下の名前を使用することはできません。
  • SQLCODE
  • SQLSTATE
  • ACTIVITY_COUNT

ローカル変数にDEFAULT句が指定されている場合は、これに定数を入れることができます。ただし、式を入れることはできません。

ローカル変数には、対応する複合文、つまりその変数が宣言される複合文のラベルを付けることができます。これは、入れ子にされた複合文でローカル変数を再使用したときに混乱が生じないようにするのに役立ちます。

パラメータ

ストアド プロシージャには、Teradata Databaseでサポートされている任意のデータ型と文字セットのパラメータを最大256個まで指定することができます。

ストアド プロシージャとその属性はデータ ディクショナリのDBC.TVFieldsテーブルに保管されます。

制御文以外のSQL文でパラメータを指定する場合は、接頭部としてコロン文字(:)を付ける必要はありません。パラメータの接頭部としてコロン文字を使用することはサポートされていますが、お勧めするものではありません。

パラメータの接頭部としてコロン文字を付けない場合、列名を同じにしないでください。

SQLパラメータ名と列名とで同じ識別子がSQL文に含まれる場合、Teradata Databaseはそれを列名と解釈します。これを防ぐには、複合文の名前で列名を修飾してください。

次の3つの名前は、ステータス変数用に予約されているため、パラメータには使用できません。
  • SQLCODE
  • SQLSTATE
  • ACTIVITY_COUNT
以下の句は、パラメータには指定できません。
  • DEFAULT
  • FORMAT
  • NOT NULL

IN、OUT、およびINOUTパラメータのルール

パラメータ 許可 禁止対象
IN SQL文のソース指定 SQL文のターゲット指定
OUT SQL文のターゲット指定 SQL文のソース指定
INOUT SQL文のソースおよびターゲット指定

パラメータは任意の有効なデータ型を持つことができます。

INOUTパラメータは、入力値と出力値の両方に使用できます。
  • 入力値は、ストアド プロシージャを実行する際に、INOUTパラメータの引数として指定できます。
  • 出力値は、プロシージャの実行後に同じパラメータから読み取ることができます。

CREATE/REPLACE PROCEDUREの全入力および全出力パラメータの合計データ サイズは1 MBです。

ストアド プロシージャの起動時、IN定数には、CALL文でオーバーライドされない限り、指定された値のデータ型が想定されます。

INOUT定数引数のデータ タイプは、定義されるデータ型ではなく、渡される値のデータ型によって規制されます。渡される値のデータ型がCREATE/REPLACE PROCEDURE文で定義されるデータ型よりも小さく、渡される値のデータ型の最大値より大きな値をストアド プロシージャが返す場合は、システムはオーバーフロー エラーを返します。

たとえば、INTEGER INOUTパラメータを定義するストアド プロシージャを考えてみます。SMALLINTに適合する定数の入力値でプロシージャを呼び出す場合に、出力値がSMALLINTの最大値である32767より大きくなるときは、システムによりオーバーフロー エラーが返されます。

ラベル

ラベルは、ストアド プロシージャ内の繰返し文(FOR、LOOP、REPEAT、およびWHILE)とBEGIN…END複合文で使用できます。次のルールが適用されます。
  • 先頭のラベルの末尾には、コロン文字(:)を付ける必要があります。
  • 繰返し文や複合文の場合、最後のラベルは必須ではありません。

    最後のラベルを指定する場合、そのラベルには、その繰返し文またはBEGIN…END文に関連付けられている対応する先頭のラベルが必要です。たとえば、END WHILEの後に最後のラベルを指定する場合は、これに対応するWHILEの前に、コロン文字の付いた同等の先頭のラベルがなければなりません。

  • ラベルの有効範囲は、そのラベルが関連付けられている繰返し文またはBEGIN…END複合文です。

    つまり、別の繰返し文や複合文が入れ子になっている場合、外側の繰返し文または複合文に関連付けられているラベル名を内側の繰返し文や複合文に使用することはできないということです。

FORループ変数

FORループ変数は、通常、FOR繰返し文の名前として用いられます。

FORループ変数は、相関名や列名への参照を修飾するために使用されます。SQL制御文を含めたSQL文内の相関名または列名の参照は、FORループ変数で修飾されないと、パラメータまたはローカル変数とみなされます。

次のルールが適用されます。
  • 制御文以外のSQL文中で使用する場合、FORループ変数には接頭部としてコロン文字(:)を付ける必要があります。
  • FORループ変数の適用範囲は、それが関連付けられているFOR文に限定されます。

    FOR文が入れ子になっている場合、外側のFOR文に関連付けられたFORループ変数は、内側のFOR文内の他の文から参照することができます。

カーソル

ストアド プロシージャでのカーソルの使用に適用されるルールおよび指針については、SQLカーソルを参照してください。

ストアド プロシージャ内のカーソル使用に関する詳細と例については、DECLARE CURSOR (ストアド プロシージャ形式)およびFORを参照してください。

相関名と列名

FOR文やDECLARE CURSOR文のカーソル指定の列には、任意選択のキーワードASを使用して別名を付けることができます。

ANSI/ISO SQL規格では、別名のことを相関名といいます。範囲変数ともいいます。次のルールが適用されます。
  • カーソル指定で使用される式には、別名を付けなければなりません。
  • 相関名や列のデータ型(文字データ型CHARACTER SET句も含む)には、カーソル指定内の対応する相関名または列のデータ型を使用します。
  • 相関名や列は、関連するFORループ変数名でこれを特定することによって、FOR繰返し文の本文で参照されなければなりません。特定されていない名前は、ローカル変数またはパラメータ名とみなされます。
  • FORループ文に含まれる相関名または列の適用範囲は、そのFOR文の本文だけに限られます。

    FOR文が入れ子になっている場合、外側のFOR文に関連付けられた相関名または列は、内側のFOR文内の文から参照することができます。

  • ストアド プロシージャでは、制御文以外のSQL文内で使用する相関名や列名の前にコロン文字(:)をつける必要があります。

サポートされるデータ型

でサポートされるデータ型はすべて、JSONデータ型、UDT(VARIANT_TYPE UDTを除く)、BLOB、およびCLOBを含め、ストアド プロシージャのパラメータおよびローカル変数で使用できます。

ストアド プロシージャにおいてUDTを正しく操作するには、UDTにおいて必須の順序付け機能とデータ変換機能が定義されていなければなりません。また、tosqlおよびfromsql変換ルーチンが、UDTとの間における事前定義された、同等の暗黙的キャスト定義によってバックアップされることも必要です。これを行なう最も簡単な方法は、CREATE TRANSFORM文とCREATE CAST文の両方で同じルーチンを参照することです。

DISTINCT型UDTの場合、システム生成のデフォルトの変換および暗黙的キャスティング機能が使用できます。

しかし、STRUCTURED型UDTの場合は、CREATE TRANSFORM文およびCREATE CAST文を使用して、機能を明示的に定義しなければなりません。

KANJI1のサポートは廃止されました。 KANJI1をデフォルトの文字セットとして使用することはできません。 システムはデフォルトのKANJI1文字セットをUNICODE文字セットに変更します。 KANJI1の新規オブジェクトの作成は、高度に制限されています。 KANJI1を使用する問合わせやアプリケーションの多くは、従来通り動作しますが、KANJI1を使用するサイトはできるだけ早く別の文字セットに変換する必要があります。

TD_ANYTYPEパラメータ データ型は、SQLストアド プロシージャでは使用できません。

ユーザーは、データ タイプがNUMBERの1つ以上のパラメータ/変数が含まれるTeradataストアド プロシージャを作成できます。NUMBERデータ タイプは、IN、OUT、INOUTのいずれかのパラメータを定義するために使用できます。またNUMBERデータ型を使用して、ストアド プロシージャ本体のローカル変数を定義することもできます。

ユーザー定義関数

ストアド プロシージャの制御文、およびストアド プロシージャ内の制御文ではないSQL文から、UDFを呼び出すことができます。これには、VARIANT_TYPE入力パラメータを持つUDFを含みます。

区切り記号

ストアド プロシージャでは、ANSIおよびTeradata Databaseでサポートされているすべての区切り記号が使用できます。いくつかの例を紹介します。
使用する区切り文字 名前 用途
; セミコロン DML、DDL、DCL文、制御文、および制御の宣言を含む、ストアド プロシージャ本体内の各文の終わりを示す。

セミコロン文字は、必須の文区切り記号です。

: コロン ストアド プロシージャ内の制御文以外のSQL文でステータス変数およびFORループ相関名を使用する場合に、接頭部となる。

複合文や繰返し文では、先頭のラベルの接尾部にもコロン文字を付ける必要があります。

( 左括弧 パラメータやCALL引数のリストを囲む。
) 右括弧

ストアド プロシージャのカンマ文字(,)、ピリオド文字(.)、およびSQL演算子のような他の区切り記号は、Teradata SQLの他の部分での使用法と同じです。

語分離記号

ストアド プロシージャでは、Teradata SQLでサポートされているすべての語分離記号(コメント、埋め込み文字、および改行文字)を使用することができます。

読みやすさを向上させるため、ストアド プロシージャ本体ではなるべく改行文字を使用する必要があります。

改行文字は、実装によって異なりますが、Enterキー(非3270端末の場合)またはReturnキー(3270端末の場合)で入力できます。

ロック修飾子

ロック修飾子は、CALLを除き、ストアド プロシージャで使用されるすべてのDML、DDL、およびDCL文でサポートされています。

結果コード変数

結果コード変数の定義と詳細については、結果コード変数SQLコミュニケーション領域(SQLCA)、およびSQLSTATEのマッピングを参照してください。

対応するSQLSTATEコードにマッピングされるTeradata Databaseの戻りコードの完全なリストは、SQLSTATEのマッピングを参照してください。

Teradata Databaseエラー コードへのSQLCODEのマッピングについては、SQLコミュニケーション領域(SQLCA)を参照してください。

トリガー

トリガーによってストアド プロシージャを呼び出すことができますが、以下の制限が適用されます。

トリガーから呼び出されるストアド プロシージャ内では、以下の文を使用できません。
  • DDL文
  • DCL文
  • BT (BEGIN TRANSACTION) … ET (END TRANSACTION)
  • COMMIT
  • 例外処理文

トリガーから呼び出されるストアド プロシージャ内では、INOUTおよびOUTパラメータを使用できません。

ストアド プロシージャに行を渡すことはできますが、テーブルを渡すことはできません。

以下の有効な例では、Sp1というストアド プロシージャに行が渡されます。

CREATE TRIGGER Trig1 AFTER INSERT ON Tab1
REFERENCING NEW AS NewRow
FOR EACH ROW
(CALL Sp1(NewRow.C1,NewRow.C2);)

以下の例では、Sp1というストアド プロシージャにテーブルが渡されます。この操作は無効で、リクエスト側に対してエラーが戻されます。

CREATE TRIGGER Trig1 AFTER INSERT ON Tab1
REFERENCING NEW_TABLE AS NewTable
FOR EACH STATEMENT
(CALL Sp1(NewTable.c1,NewTable.C2);)

キュー テーブル

ストアド プロシージャはキュー テーブルをサポートします。

複文リクエスト

ストアド プロシージャは複文リクエストをサポートします。

コメント

ストアド プロシージャではコメントを使用できます(入れ子の括弧で囲まれたコメントを除く)。

コメントのANSI/ISO SQL:2011定義には、Teradata Databaseスタイル コメントと呼ばれるコメントも含まれます。規格によってコメント タイプは次のように区別されます。
コメントの構造 ANSI名
-- 単純なコメント
/* … */ 括弧で囲まれたコメント

括弧で囲まれたコメントはANSI/ISO SQL:2011規格でも定義されていますが、Teradataスタイル コメントと呼ばれることもあります。

関連トピック

以下に関する詳細な情報
  • ストアド プロシージャの名前付けに適用されるルールについては、<Teradata Vantage™ SQL基礎、B035-1141>の「SQLの語彙」を参照してください。
  • キーワードの詳細について、<Teradata Vantage™ SQL基礎、B035-1141>を参照してください。
  • ローカル変数については、DECLAREおよびサポートされるデータ型を参照してください。
  • ストアド プロシージャ パラメータについては、サポートされるデータ型を参照してください。
  • ホスト変数と「USING行記述子」は、パラメータと同じ概念(ただし名前が異なる)の説明について<Teradata Vantage™ SQL外部ルーチン プログラミング、B035-1147>を参照してください。
  • 他のルール、およびストアド プロシージャのパラメータの詳細説明と使用例については、<Teradata Vantage™ SQLデータ操作言語、B035-1146>のCALL文に関する説明と、<Teradata Vantage™ SQLデータ定義言語の構文規則および例、B035-1144>のCREATE PROCEDURE文に関する説明を参照してください。
  • データ型の詳細および使用上の考慮事項については、<Teradata Vantage™ SQL基礎、B035-1141>の「SQLの語彙」、および<Teradata Vantage™データ型およびリテラル、B035-1143>を参照してください。
  • ストアド プロシージャでのLOBの操作の指針については、<Teradata Vantage™ SQL基礎、B035-1141>の「CREATE PROCEDURE(内部形式)」を参照してください。
  • JSONデータ型についての詳細は、<Teradata Vantage™ JSONデータ型、B035-1150>を参照してください。
  • ストアド プロシージャ内のUDTを正しく操作する場合の文の詳細については、<Teradata Vantage™ SQL基礎、B035-1141>を参照してください。
  • ストアド プロシージャは複文リクエストをサポートします。<Teradata Vantage™ SQL基礎、B035-1141>の"CREATE PROCEDURE(内部形式)"にある、"ストアド プロシージャでのSQL複文サポート"を参照してください。
  • キュー テーブルでカーソルを使用する場合は、<Teradata Vantage™ SQL基礎、B035-1141>を参照してください。