引数の動作 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQL外部ルーチン プログラミング

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
17.00
Published
2020年6月
Language
日本語
Last Update
2021-03-30
dita:mapPath
ja-JP/qwr1571437338192.ditamap
dita:ditavalPath
ja-JP/qwr1571437338192.ditaval
dita:id
B035-1147
Product Category
Software
Teradata Vantage

文字列引数の切り捨て

セッション トランザクション モードによって、文字列の切り捨て方法が違います。

セッション トランザクション モード 切り捨ての必要な入力文字列の切り捨て方法
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進/数値型データ型」を参照してください。