FNC_SetStructuredAttributeByNdx - Advanced SQL Engine - Teradata Database

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

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Published
2021年7月
Language
日本語
Last Update
2021-09-23
dita:mapPath
ja-JP/rin1593638965306.ditamap
dita:ditavalPath
ja-JP/wrg1590696035526.ditaval
dita:id
B035-1147
Product Category
Software
Teradata Vantage

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

構文

void
FNC_SetStructuredAttributeByNdx ( UDT_HANDLE  udtHandle,
                                  int         attributeIndex,
                                  void       *newValue,
                                  int         nullIndicator,
                                  int         length )

構文要素

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

    newValue引数は無視されます。

  • 0の場合、FNC_SetStructuredAttributeByNdxは属性をnewValueが指す値に設定します。
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引数に入れて渡す値が必ずVantageのデータ型の長さに一致するようにするには、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バイトになります。これは、Vantageが小数部分に最大長(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);    ...
}