文字列引数の切り捨て
セッション トランザクション モードによって、文字列の切り捨て方法が違います。
セッション トランザクション モード | 切り捨ての必要な入力文字列の切り捨て方法 |
---|---|
Teradata | エラー報告なしで切り捨てられます。マルチバイト文字を使ったKanji1文字列で切り捨てが発生すると、マルチバイト文字の一方のバイトが切り捨てられることがあります。 |
ANSI | 余分の埋め込み文字の切り捨てはエラー報告なしで実行されます。その他の文字が切り捨てられる場合には、切り捨て例外になります。 |
結果文字列には、通常の切り捨てルールが適用されます。詳細は、<Teradata Vantage™ - データ タイプおよびリテラル、B035-1143>の「文字切り捨てルール」を参照してください。
リテラル引数としてNULLを使用する場合の動作
入力引数のいずれかにNULLキーワードが使用された場合の動作は、CREATE TYPE文のMETHOD指定のRETURNS NULL ON NULL INPUTオプションとCALLED ON NULL INPUTオプションによって決まります。
入力引数がNULLの場合に、対応するCREATE TYPE文が指定する内容 | パラメータ スタイル | 結果 |
---|---|---|
RETURNS NULL ON NULL INPUT | SQL または TD_GENERAL | メソッドは評価されず、結果は常にNULLになります。 |
CALLED ON NULL INPUT | SQL | 該当するインジケータをNULL標識に設定してメソッドが呼び出されます。 |
TD_GENERAL | エラーが報告されます。 |
CREATE TYPE文のMETHOD指定にRETURNS NULL ON NULL INPUTもCALLED ON NULL INPUTも指定されていない場合のデフォルトは、CALLED ON NULL INPUTです。
リテラル引数としてのNULLは、任意のデータ型のパラメータと互換性があります。例えば、以下のようなaddress UDTおよびmap_itメソッドがあるとします。
CREATE TYPE address AS ( street VARCHAR(20), zip CHAR(5) ) NOT FINAL INSTANCE METHOD map_it( CHAR(4), INTEGER ) RETURNS INTEGER SPECIFIC mapit LANGUAGE C PARAMETER STYLE SQL DETERMINISTIC NO SQL; CREATE METHOD map_it( map_type CHAR(4), code INTEGER ) RETURNS INTEGER FOR address EXTERNAL NAME 'CS!map_it!udm_src/map_it.c!F!mapit';
以下のようにNULLキーワードは任意のメソッド引数として渡すことができ、いずれも正常に動作します。
CREATE TABLE locations( id INTEGER, details address ); SELECT details.map_it('4415', NULL) FROM locations; SELECT details.map_it(NULL, NULL) FROM locations;
呼び出すメソッドをTeradata Databaseが明確に識別できない場合、オーバーロード メソッドへの引数としてNULLキーワードを渡すと、エラーが発生することがあります。詳細は、オーバーロード関数の呼び出しを参照してください。
オーバーフローと数値引数
数値オーバーフロー状態が発生しないようにするため、C/C++関数のDECIMALデータ型は、処理の可能な限り大きい型として定義してください。
入力または出力の数値引数に値を代入する際に有効桁が失われるなら、数値オーバーフロー エラーになります。
例えば、1個のDECIMAL(2,0)を引数とする次のインスタンス メソッドがあるとします。
CREATE TYPE circle AS ( x INTEGER, y INTEGER, radius INTEGER ) NOT FINAL INSTANCE METHOD smldec( DECIMAL(2,0) ) RETURNS INTEGER SPECIFIC smldec LANGUAGE C PARAMETER STYLE SQL DETERMINISTIC NO SQL; CREATE METHOD smldec( DECIMAL(2,0) ) RETURNS INTEGER FOR circle EXTERNAL NAME 'CS!smldec!udm_src/smldec.c!F!smldec';
2桁以内の数値を渡す場合は、正常に実行されます。
SELECT circle_column.smldec(99) FROM circle_tbl WHERE c_id = 100;
99より大きい数値または-99より小さい数値を渡すと、有効桁が失われます。
SELECT circle_column.smldec(100) FROM circle_tbl WHERE c_id = 100; Failure 2616 Numeric overflow occurred during computation.
小数の数値データが渡されたり戻されたりする場合、その値が代入先に入らないときには、Teradata Database丸めルールに従って丸められます。丸めについての詳細は、<Teradata Vantage™ - データ タイプおよびリテラル、B035-1143>の「10進/数値型データ型」を参照してください。