17.00 - 17.05 - FNC_SetStructuredAttributeByNdx - Advanced SQL Engine - Teradata Database

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

Product
Advanced SQL Engine
Teradata Database
Release Number
17.00
17.05
Published
2020年6月
Content Type
プログラミング リファレンス
Publication ID
B035-1147-170K-JPN
Language
日本語 (日本)

目的

STRUCTURED型のLOB以外である属性の値を設定します。

構文

void
FNC_SetStructuredAttributeByNdx ( UDT_HANDLE  udtHandle,
                                  int         attributeIndex,
                                  void       *newValue,
                                  int         nullIndicator,
                                  int         length )
UDT_HANDLE udtHandle
STRUCTURED型UDTへのハンドル。
int attributeIndex
UDTの最上位レベルでの属性のインデックス。
値の範囲は0からi-1です。0はUDTの最初の属性のインデックスであり、iはUDTのネストしていない属性の数です。
例えば、次の2つの属性を持つ、PointUDTと呼ばれるSTRUCTURED型UDTがあるとします。最初の属性はx、2番目の属性はyと呼ばれます。xの値を設定するには、インデックス0を使用します。同様に、yの値を設定するには、インデックス1を使用します。
ネストされた属性の値を設定する方法の詳細については、ネストされた属性の値の設定を参照してください。
void *newValue
属性の新しい値が入っているバッファを指すポインタ。
指定した属性がSTRUCTURED型UDTである場合、nullIndicator引数を使ってその属性をNULLに設定することはできますが、newValue引数とlength引数はFNC_SetStructuredAttributeByNdxによって無視されます。
int *nullIndicator
属性をNULLに設定するかどうかを示す標識。
nullIndicatorの値
  • -1の場合、FNC_SetStructuredAttributeByNdxは属性をNULLに設定します。

    newValue引数は無視されます。

  • 0の場合、FNC_SetStructuredAttributeByNdxは属性をnewValueが指す値に設定します。
int length
newValueバッファのバイト単位のサイズ。
指定した属性がSTRUCTURED型UDTである場合、nullIndicator引数を使ってその属性をNULLに設定することはできますが、newValue引数とlength引数はFNC_SetStructuredAttributeByNdxによって無視されます。

使用上の注意

newValueが指すバッファを定義するには、属性の基礎となる型にマッピングされるCデータ型を使用します。例えば、DISTINCT型がSQL INTEGERデータ型を表わす場合、次のようにバッファを定義することができます。

INTEGER value;
value = 2048;

使用できるCデータ型の詳細は、Cデータ型を参照してください。

属性の基礎となる型が文字列で、その型で定義されているサイズよりもnewValue文字列のほうが短い場合には、その右側にFNC_SetStructuredAttributeByNdxによって領域が埋め込まれます。

文字データ型はNULL文字の埋め込みに対応しているため、length引数に入れて渡す値にNULL終了文字の分は含めないでください。

length引数に入れて渡す値が必ずTeradata Databaseのデータ型の長さに一致するようにするには、sqltypes_td.hヘッダー ファイルに定義されているこれらのマクロを使用します。

マクロ 説明
SIZEOF_CHARACTER_LATIN(len)
SIZEOF_CHARACTER_KANJISJIS(len)
SIZEOF_CHARACTER_KANJI1(len)
SIZEOF_CHARACTER_UNICODE(len)
文字数lenのCHARACTERデータ型のバイト単位の長さを戻します。例えば、以下の式は6 (3 * 2 = 6)の長さを戻します。
SIZEOF_CHARACTER_UNICODE(3)
SIZEOF_VARCHAR_LATIN(len)
SIZEOF_VARCHAR_KANJISJIS(len)
SIZEOF_VARCHAR_KANJI1(len)
SIZEOF_VARCHAR_UNICODE(len)
文字数lenのVARCHARデータ型のバイト単位の長さを戻します。例えば、以下の式は6 (3 * 2 = 6)の長さを戻します。
SIZEOF_VARCHAR_UNICODE(3)
SIZEOF_BYTE(len)
SIZEOF_VARBYTE(len)
指定されたBYTEデータ型またはVARBYTEデータ型のバイト単位の長さを戻します(lenは値の数)。
SIZEOF_GRAPHIC(len)
SIZEOF_VARGRAPHIC(len)
指定されたCHARACTER(n) CHARACTER SET GRAPHICまたはVARCHAR(n) CHARACTER SET GRAPHICのデータ型長がバイト数単位で返されます。lenはここで値の数を指定します。
SIZEOF_BYTEINT
SIZEOF_SMALLINT
SIZEOF_INTEGER
SIZEOF_BIGINT
SIZEOF_REAL
SIZEOF_DOUBLE_PRECISION
SIZEOF_FLOAT
SIZEOF_DECIMAL1
SIZEOF_DECIMAL2
SIZEOF_DECIMAL4
SIZEOF_DECIMAL8
SIZEOF_DECIMAL16
SIZEOF_NUMERIC1
SIZEOF_NUMERIC2
SIZEOF_NUMERIC4
SIZEOF_NUMERIC8
SIZEOF_NUMERIC16
SIZEOF_NUMBER
指定された数値データ型のバイト単位の長さを戻します。

NUMBERの場合、返される長さは4 + 2 + 17 = 23バイトになります。これは、Teradata Databaseが小数部分に最大長(17バイト)を割り当てるためです。

SIZEOF_DATE
SIZEOF_ANSI_Time
SIZEOF_ANSI_Time_WZone
SIZEOF_TimeStamp
SIZEOF_TimeStamp_WZone
指定された日付/時刻型のバイト単位の長さを戻します。
SIZEOF_INTERVAL_YEAR
SIZEOF_IntrvlYtoM
SIZEOF_INTERVAL_MONTH
SIZEOF_INTERVAL_DAY
SIZEOF_IntrvlDtoH
SIZEOF_IntrvlDtoM
SIZEOF_IntrvlDtoS
SIZEOF_HOUR
SIZEOF_IntrvlHtoM
SIZEOF_IntrvlHtoS
SIZEOF_MINUTE
SIZEOF_IntrvlMtoS
SIZEOF_IntrvlSec
指定されたINTERVAL型のバイト単位の長さを戻します。

ネストされた属性の値の設定

UDF、UDM、または外部ストアド プロシージャへの戻り値として定義されているUDTの階層内でネストされている属性の値を設定するには、以下のようにします。

  1. FNC_GetStructuredAttributeByNdxを呼び出して、ターゲット属性へのパス内の次のSTRUCTURED型UDT属性のUDTハンドルを取得します。

    このステップを繰り返し、udtHandle引数として新しく取得したUDTハンドルでnを-2回渡します。nは、ターゲット属性のネスト レベルです。

  2. FNC_SetStructuredAttributeByNdxを呼び出し、ターゲット属性を含むSTRUCTURED型UDT属性のUDTハンドルで渡します。

制限

CLIv2を使用してSQLを実行する外部ストアド プロシージャは、未処理のCLIv2リクエストが完了するまで、この関数を呼び出すことはできません。

FNC_SetStructuredAttributeByNdxの使用例

void setY( UDT_HANDLE *pointUdt,
           INTEGER    *val,
           UDT_HANDLE *resultPoint,
           char        sqlstate[6])
{
    INTEGER newval;
    int nullIndicator;
    int length;

    /* Set the y attribute (second attribute) of the result point. */
    nullIndicator = 0;
    newval = *val;
    FNC_SetStructuredAttributeByNdx(*resultPoint, 1, &newval,                                    nullIndicator, SIZEOF_INTEGER);    ...
}