Example Using FNC_SetArrayElementsWithMultiValues - Advanced SQL Engine - Teradata Database

SQL External Routine Programming

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Published
July 2021
Language
English (United States)
Last Update
2021-07-27
dita:mapPath
rin1593638965306.ditamap
dita:ditavalPath
rin1593638965306.ditaval
dita:id
B035-1147
lifecycle
previous
Product Category
Teradata Vantageā„¢

The following example is based on the following n-D ARRAY definition:

/*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 sets the values of a set of elements from a source */
/* ARRAY myArray1 to the same positions of values in myArray2.*/

void setElements ( ARRAY_HANDLE    *myArray1,
                   ARRAY_HANDLE    *myArray2,
                   INTEGER         *result,
                   char             sqlstate[6])
{
    bounds_t *arrayRange;
    array_info_t arrayInfo;
    long length;
    long bufferSize = sizeof_integer * 4;
    int *resultBuf;
    NullBitVecType *NullBitVector;
    long nullVecBufSize;
    bounds_t arrayScope[FNC_ARRAYMAXDIMENSIONS];

    /* Call FNC_GetArrayTypeInfo first to find out the number of */
    /* elements in myArray1. */
    FNC_GetArrayTypeInfo(*myArray1,
                         &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 myArray1. */
    FNC_GetArrayElements(*myArray1, arrayRange, resultBuf, bufferSize,
       NullBitVector, nullVecBufSize, &length);

    /* Set the element values within the same positions of myArray2 */
    /* with the values from myArray1. */
    FNC_SetArrayElementsWithMultiValues(*myArray2, &arrayRange,
       (void*)resultBuf, bufferSize, NullBitVector, nullVecBufSize);
    ...
}