名前
ストアド プロシージャの名前、ならびにストアド プロシージャ パラメータ、ローカル変数、ラベル、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つのスペースとして扱われます。
リテラル
ストアド プロシージャでは、Vantageがサポートしている、制御文を含むSQL文のテキストに直接値を指定するためのリテラルがすべて有効です。
ローカル変数
ストアド プロシージャのBEGIN…END複合文における変数の宣言文では、Vantageがサポートしているすべてのデータ型のローカル変数を指定できます。
各複合文には複数の変数の宣言を設けることができ、また、それぞれのDECLARE文には複数のローカル変数を含めることができます。
ローカル変数は任意の有効なデータ型を持つことができます。
制御文以外のSQL文でローカル変数を指定する場合は、接頭部としてコロン文字(:)を付ける必要はありません。ローカル変数の接頭部のコロンは引き続きサポートされていますが、お勧めするものではありません。
ローカル変数の接頭部としてコロン文字を付けない場合、変数名と列名を同じにしないでください。
SQL変数名と列名とで同じ識別子がSQL文に含まれる場合、Teradataはその識別子を列名と解釈します。これを防ぐには、列名と同じSQL変数の識別子を複合文名で修飾してください。
- SQLCODE
- SQLSTATE
- ACTIVITY_COUNT
ローカル変数にDEFAULT句が指定されている場合は、これに定数を入れることができます。ただし、式を入れることはできません。
ローカル変数には、対応する複合文、つまりその変数が宣言される複合文のラベルを付けることができます。これは、入れ子にされた複合文でローカル変数を再使用したときに混乱が生じないようにするのに役立ちます。
パラメータ
ストアド プロシージャには、Vantageでサポートされている任意のデータ型と文字セットのパラメータを最大256個まで指定することができます。
ストアド プロシージャとその属性はデータ ディクショナリのDBC.TVFieldsテーブルに保管されます。
制御文以外のSQL文でパラメータを指定する場合は、接頭部としてコロン文字(:)を付ける必要はありません。パラメータの接頭部としてコロン文字を使用することはサポートされていますが、お勧めするものではありません。
パラメータの接頭部としてコロン文字を付けない場合、列名を同じにしないでください。
SQLパラメータ名と列名とで同じ識別子がSQL文に含まれる場合、データベースはそれを列名と解釈します。これを防ぐには、複合文の名前で列名を修飾してください。
- SQLCODE
- SQLSTATE
- ACTIVITY_COUNT
- DEFAULT
- FORMAT
- NOT NULL
IN、OUT、およびINOUTパラメータのルール
パラメータ | 許可 | 禁止対象 |
---|---|---|
IN | SQL文のソース指定 | SQL文のターゲット指定 |
OUT | SQL文のターゲット指定 | SQL文のソース指定 |
INOUT | SQL文のソースおよびターゲット指定 | — |
パラメータは任意の有効なデータ型を持つことができます。
- 入力値は、ストアド プロシージャを実行する際に、INOUTパラメータの引数として指定できます。
- 出力値は、プロシージャの実行後に同じパラメータから読み取ることができます。
CREATE/REPLACE PROCEDUREの全入力および全出力パラメータの合計データ サイズは1 MBです。
ストアド プロシージャの起動時、IN定数には、CALL文でオーバーライドされない限り、指定された値のデータ型が想定されます。
INOUT定数引数のデータ タイプは、定義されるデータ型ではなく、渡される値のデータ型によって規制されます。渡される値のデータ型がCREATE/REPLACE PROCEDURE文で定義されるデータ型よりも小さく、渡される値のデータ型の最大値より大きな値をストアド プロシージャが返す場合は、システムはオーバーフロー エラーを返します。
たとえば、INTEGER INOUTパラメータを定義するストアド プロシージャを考えてみます。SMALLINTに適合する定数の入力値でプロシージャを呼び出す場合に、出力値がSMALLINTの最大値である32767より大きくなるときは、システムによりオーバーフロー エラーが返されます。
ラベル
- 先頭のラベルの末尾には、コロン文字(:)を付ける必要があります。
- 繰返し文や複合文の場合、最後のラベルは必須ではありません。
最後のラベルを指定する場合、そのラベルには、その繰返し文または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を使用して別名を付けることができます。
- カーソル指定で使用される式には、別名を付けなければなりません。
- 相関名や列のデータ型(文字データ型CHARACTER SET句も含む)には、カーソル指定内の対応する相関名または列のデータ型を使用します。
- 相関名や列は、関連するFORループ変数名でこれを特定することによって、FOR繰返し文の本文で参照されなければなりません。特定されていない名前は、ローカル変数またはパラメータ名とみなされます。
- FORループ文に含まれる相関名または列の適用範囲は、そのFOR文の本文だけに限られます。
FOR文が入れ子になっている場合、外側のFOR文に関連付けられた相関名または列は、内側のFOR文内の文から参照することができます。
- ストアド プロシージャでは、制御文以外のSQL文内で使用する相関名や列名の前にコロン文字(:)をつける必要があります。
サポートされるデータ型
Vantageでサポートされるデータ型はすべて、JSONデータ型、UDT(VARIANT_TYPE UDTを除く)、BLOB、およびCLOBを含め、ストアド プロシージャのパラメータおよびローカル変数で使用できます。
DISTINCT型UDTの場合、システム生成のデフォルトの変換および暗黙的キャスティング機能が使用できます。
しかし、STRUCTURED型UDTの場合は、CREATE TRANSFORM文およびCREATE CAST文を使用して、機能を明示的に定義しなければなりません。
TD_ANYTYPEパラメータ データ型は、SQLストアド プロシージャでは使用できません。
ユーザーは、データ タイプがNUMBERの1つ以上のパラメータ/変数が含まれるTeradataストアド プロシージャを作成できます。NUMBERデータ タイプは、IN、OUT、INOUTのいずれかのパラメータを定義するために使用できます。またNUMBERデータ型を使用して、ストアド プロシージャ本体のローカル変数を定義することもできます。
ユーザー定義関数
ストアド プロシージャの制御文、およびストアド プロシージャ内の制御文ではないSQL文から、UDFを呼び出すことができます。これには、VARIANT_TYPE入力パラメータを持つUDFを含みます。
区切り記号
使用する区切り文字 | 名前 | 用途 |
---|---|---|
; | セミコロン | DML、DDL、DCL文、制御文、および制御の宣言を含む、ストアド プロシージャ本体内の各文の終わりを示す。 セミコロン文字は、必須の文区切り記号です。 |
: | コロン | ストアド プロシージャ内の制御文以外のSQL文でステータス変数およびFORループ相関名を使用する場合に、接頭部となる。 複合文や繰返し文では、先頭のラベルの接尾部にもコロン文字を付ける必要があります。 |
( | 左括弧 | パラメータやCALL引数のリストを囲む。 |
) | 右括弧 |
ストアド プロシージャのカンマ文字(,)、ピリオド文字(.)、およびSQL演算子のような他の区切り記号は、Teradata SQLの他の部分での使用法と同じです。
語分離記号
ストアド プロシージャでは、Teradata SQLでサポートされているすべての語分離記号(コメント、埋め込み文字、および改行文字)を使用することができます。
読みやすさを向上させるため、ストアド プロシージャ本体ではなるべく改行文字を使用する必要があります。
改行文字は、実装によって異なりますが、Enterキー(非3270端末の場合)またはReturnキー(3270端末の場合)で入力できます。
ロック修飾子
ロック修飾子は、CALLを除き、ストアド プロシージャで使用されるすべてのDML、DDL、およびDCL文でサポートされています。
結果コード変数
結果コード変数の定義と詳細については、結果コード変数、SQLコミュニケーション領域(SQLCA)、およびSQLSTATEのマッピングを参照してください。
対応するSQLSTATEコードにマッピングされる戻りコードの完全なリストは、SQLSTATEのマッピングを参照してください。
システム エラー コードへのSQLCODEのマッピングについては、SQLコミュニケーション領域(SQLCA)を参照してください。
トリガー
トリガーによってストアド プロシージャを呼び出すことができますが、以下の制限が適用されます。
- DDL文
- DCL文
- BEGIN TRANSACTIONまたはBT
- END TRANSACTIONまたはET
- 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名 |
---|---|
-- | 単純なコメント |
/* … */ | 括弧で囲まれたコメント |
括弧で囲まれたコメントはANSI/ISO SQL:2011規格でも定義されていますが、Teradataスタイル コメントと呼ばれることもあります。
関連情報
- ストアド プロシージャの命名に適用されるルール。<Teradata Vantage™ - SQLの基本、B035-1141>を参照してください。
- キーワードの詳細について、<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>および<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(内部形式)に関する情報を参照してください。
- キュー テーブルでカーソルを使用する場合は、<Teradata Vantage™ - SQLの基本、B035-1141>を参照してください。