CALL文では、入力パラメータと出力パラメータからなる呼び出し引数を指定しなければなりません。プロシージャの作成時にパラメータのデフォルト値を定義できません。このため、必要な呼出し引数を指定しない場合は、CALLがエラーを返します。
- CALL文に指定する呼び出し引数の数は、呼び出すプロシージャ内のパラメータの数と等しくなければなりません。
呼び出すプロシージャにパラメータがない場合は、呼び出し引数を指定できません。
- IN、INOUT、OUT引数は、呼び出すプロシージャのIN、INOUT、OUTパラメータにそれぞれ対応していなければなりません。
- INOUTパラメータの入力値のデフォルト データ型は、実行時にINOUTパラメータに渡されるデータを格納できる最も狭い型によって決まります。プロシージャを作成したCREATE PROCEDURE(外部またはSQL形式)文でパラメータに対して定義されているデフォルト型ではありません。INOUTパラメータに渡される出力値のサイズがそのパラメータの入力値から派生したデフォルト データ型の容量を超えたときにメモリ オーバフロー エラーが発生しないようにするには、次のいずれかの予防策をとる必要があります。
- CALL文で明示的にINOUTパラメータのデータ型をキャストして、メモリ オーバーフロー エラーが発生しないようにする。
例えば、次のCALL文を実行した場合、INOUTパラメータへの入力値を格納できる最も小さいデータ型はSMALLINTであることがシステムによって決定されます。SMALLINTには2バイト必要です。システムは、プロシージャの作成時に割り当てられたデータ型に関係なく、パラメータにSMALLINT型を割り当てます。
CALL my_proc(32767);
ただし、呼び出しでINOUTパラメータに32,768以上の値が返された場合は、プロシージャの作成時にパラメータに割り当てられた型または最低でもINTEGERにキャストしない限り、文はアボートされます。INTEGER型には最大2,147,483,647の正の値を格納でき、BIGINT型には最大9,223,372,036,854,775,807の正の値を格納でき、DECIMAL/NUMERIC型にはさらに大きな値を格納できます。詳細については、<SQLデータ型およびリテラル>および<Database Design>を参照してください。例えば、次のように文を書き換えることができます。
CALL my_proc (CAST('32767' AS INTEGER));
- 適切な型変換が実行されるように、呼び出し側のアプリケーションを記述します。JDBCの例については、例: INOUTパラメータでのメモリ オーバーフロー エラーの防止の例4を参照してください。
詳細については、<Teradata Vantage™ SQLデータ定義言語 - 詳細トピック、B035-1184>の「CREATE PROCEDURE(外部形式)」または「CREATE PROCEDURE(SQL形式)」を参照してください。
INOUTパラメータのデフォルト データ型が確実に値を格納できるようにするか、メモリ オーバーフロー エラーが発生しないようにするためにキャスト先のデータ型を特定する必要があります。リテラルのサイズを特定する方法の詳細については、<Teradata Vantage™データ タイプおよびリテラル、B035-1143>のデータ リテラルを参照してください。
- CALL文で明示的にINOUTパラメータのデータ型をキャストして、メモリ オーバーフロー エラーが発生しないようにする。
- CALLをさまざまなクライアント ユーティリティから実行する場合は、さらにいくつかのルールと制約事項が適用されます。固有のルールおよび制約については、以下を参照してください。
- INパラメータには入力のみ、OUTパラメータには出力のみを設定できます。INOUTパラメータの場合は、入力と出力の両方を設定できます。
- 呼び出し引数のデータ型は、呼び出すプロシージャ内の対応するパラメータのデータ型と互換性がなければなりません。
- 呼び出したプロシージャ内の対応するINまたはINOUTパラメータにNULL値を代入するために、NULLの値式を使用できます。
- プロシージャが正常に実行された場合、成功応答内のACTIVITY_COUNTは以下の値に設定されます。
ACTIVITY_COUNTの設定 | プロシージャの内容 |
---|---|
1 | 出力(INOUTまたはOUT)パラメータ。 |
0 | 出力パラメータなし |