文字列引数の切り捨て
セッション トランザクション モードによって、文字列の切り捨て方法が違います。
セッション トランザクション モード | 切り捨ての必要な入力文字列の切り捨て方法 |
---|---|
Teradata | エラー報告なしで切り捨てられます。マルチバイト文字を使ったKanji1文字列で切り捨てが発生すると、マルチバイト文字の一方のバイトが切り捨てられることがあります。 |
ANSI | 余分の埋め込み文字の切り捨てはエラー報告なしで実行されます。その他の文字が切り捨てられる場合には、切り捨て例外になります。 |
結果文字列には、通常の切り捨てルールが適用されます。詳細は、<Teradata Vantage™ - データ タイプおよびリテラル、B035-1143>の「文字切り捨てルール」を参照してください。
リテラル引数としてNULLを使用する場合の動作
NULLリテラルを入力引数として適切に処理するため、CREATE PROCEDURE文またはREPLACE PROCEDURE文のパラメータ リストのSQLデータ型がJavaプリミティブにマッピングされる場合は、外部ストアド プロシージャではデフォルトのマッピング規則を使用できません。
デフォルトのマッピングを上書きし、NULLリテラルを入力引数として処理できるJavaクラスにSQLデータ型をマッピングするには、CREATE PROCEDURE文またはREPLACE PROCEDURE文のEXTERNAL NAME句において、Javaメソッドのパラメータ リストのマッピングを明示的に指定する必要があります。
SQLデータ型がJavaデータ型にマッピングされる仕組みについては、SQLデータ型のマッピングを参照してください。デフォルト マッピングの変更方法を示した例については、パラメータ リストを参照してください。
オーバーフローと数値引数
数値オーバーフロー状態が発生しないようにするには、Java外部ストアド プロシージャのDECIMALデータ型またはNUMERICデータ型を、処理が可能な限り大きい型として定義してください。
入力または出力の数値引数に値を代入する際に有効桁が失われるなら、数値オーバーフロー エラーになります。
例えば、1個のDECIMAL(2,0)を引数とする次の外部ストアド プロシージャがあるとします。
CREATE PROCEDURE smldec( IN p1 DECIMAL(2,0) ) LANGUAGE JAVA READS SQL DATA PARAMETER STYLE JAVA EXTERNAL NAME 'NumJAR:NumClass.smldec';
2桁以内の数値を渡す場合は、正常に実行されます。
CALL smldec(99);
99より大きい数値または-99より小さい数値を渡すと、有効桁が失われます。
CALL smdec(100); Failure 2616 Numeric overflow occurred during computation.
小数の数値データが渡されたり戻されたりする場合、その値が代入先に入らないなら、Teradata丸めルールに従って丸められます。丸めについての詳細は、<Teradata Vantage™ - データ タイプおよびリテラル、B035-1143>の「10進/数値型データ型」を参照してください。
INOUT定数引数のデータ型
INOUT定数引数のデータ型は、定義される内容ではなく、渡される値のデータ型によって決定されます。渡される値のデータ型がCREATE PROCEDURE文またはREPLACE PROCEDURE文で定義されるデータ型より小さく、外部ストアド プロシージャが、渡される値のデータ型の最大値より大きい値を戻す場合は、オーバーフロー エラーが戻されます。
例えば、以下のような、INTEGER INOUTパラメータを定義する外部ストアド プロシージャがあるとします。
CREATE PROCEDURE inout_example( INOUT p1 INTEGER ) LANGUAGE JAVA READS SQL DATA PARAMETER STYLE JAVA EXTERNAL NAME 'NumJAR:NumClass.inout_example';
SMALLINTに適合する定数入力値を持つ外部ストアド プロシージャを呼び出すと、出力値がSMALLINTの最大値である32767より大きい場合に、オーバーフロー エラーが戻されます。
CALL inout_example(1000);