FNC_SetNullBitVectorByElemIndex の使用例 - 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

この例では、memset()を呼び出して、新しいNullBitVectorのすべてのバイトを0に設定することで初期化します。このNullBitVectorは、phonenumbers_ary型のARRAY用に呼び出し側で事前に割り当てられています。この操作に必要な情報は、FNC_GetArrayTypeInfoを呼び出すことで取得します。その後で、FNC_SetNullBitVectorByElemIndexを呼び出して、1つのビットを「存在しない」に設定します。

ここに示す例は、次の2-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];

void ArrayUDF ( ARRAY_HANDLE  *a,
                char           sqlstate[6])
{
    NullBitVecType *NullBitVector;
    array_info_t arrayInfo;
    long nullVecBufSize;
    int aryIndex[FNC_ARRAYMAXDIMENSIONS];
    bounds_t arrayScope[FNC_ARRAYMAXDIMENSIONS];

    /* Call FNC_GetArrayTypeInfo first to find out the number of */
    /* elements in the array. */
    FNC_GetArrayTypeInfo(*a,
                         &arrayInfo,
                         arrayScope);
    (arrayInfo.totalNumElements % 8 == 0) ?
       (nullVecBufSize = arrayInfo.totalNumElements / 8) :
       (nullVecBufSize = arrayInfo.totalNumElements / 8) + 1;

    /* Allocate a new NullBitVector array. */
    NullBitVector = (NullBitVecType*)FNC_malloc(nullVecBufSize);

    /* Initialize the NullBitVector to default values */
    memset(NullBitVector, 0, nullVecBufSize);

    /* Set one bit in NullBitVector to 1 (present) */
    aryIndex[0] = 1;
    aryIndex[1] = 1;
    FNC_SetNullBitVectorByElemIndex(NullBitVector, aryIndex, 1,
       nullVecBufSize, arrayScope, arrayInfo.numDimensions);
    ...
}