17.00 - 17.05 - FNC_GetArrayElementsの使用例 - 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
日本語 (日本)

この例は、次のn-D ARRAY定義に基づいています。

/*Oracle-compatible and Teradata syntax respectively: */
CREATE TYPE myArray AS VARRAY(1:20)(1:20) OF integer;
CREATE TYPE myArray AS integer ARRAY[1:20][1:20];

/*This function returns a range of element values */
void getMultiElement ( ARRAY_HANDLE  *ary_handle,
                       void          *result,
                       char           sqlstate[6])
{
    long length;
    long bufferSize = sizeof_integer * 4;
    int *resultBuf;
    NullBitVecType    *NullBitVector;
    array_info_t arrayInfo;
    int totalElements;
    long nullVecBufSize;
    bounds_t *arrayRange;
    bounds_t arrayScope[FNC_ARRAYMAXDIMENSIONS];

    /* Call FNC_GetArrayTypeInfo first to find out the number of */
    /* elements in the array. */
    FNC_GetArrayTypeInfo(*ary_handle,
                         &arrayInfo,
                         arrayScope);
    nullVecBufSize = arrayInfo.totalNumElements;

    resultBuf = (int*)FNC_malloc(bufferSize);

    arrayRange =
    (bounds_t*)FNC_malloc(sizeof(bounds_t)*arrayInfo.numDimensions);

    /* Allocate a new NullBitVector to pass to FNC_GetArrayElements */
    NullBitVector = (NullBitVecType*)FNC_malloc(nullVecBufSize);

    /* Set all members of NullBitVector to 0 */
    memset(NullBitVector, 0, nullVecBufSize);

    /* Set values of arrayRange to correspond to the range [1:2][2:3] */
    arrayRange[0].lowerBound = 1;
    arrayRange[0].upperBound = 2;
    arrayRange[1].lowerBound = 2;
    arrayRange[1].upperBound = 3;

    /* Get elements within the range [1:2][2:3] of myArray. */
    FNC_GetArrayElements(*ary_handle, &arrayRange, resultBuf,
       bufferSize, NullBitVector, NullVecBufSize, &length);
}

この例は、resultBufに格納された4つの整数の配列を返します。この4つの値は次のとおりです。

10 12 20 33

これらの値は、整数値としてresultBufの該当するエントリを取得することで直接アクセスできます。