我试图在Teradata中为IRR创建一个UDF。
我希望以数组的形式存储我的中间存储中的行的所有元素(一次添加一个)。这有助于我多次使用这些元素(使用试错法逻辑)
我只是想知道,这是" typedef"中使用的兼容数据类型。对于teradata中的这个要求?
由于IRR逻辑有些冗长,我在新的sum_redefined函数的帮助下代表我的问题。
我只是试图通过将传递的参数(行元素)存储到数组中并在之后添加它们来计算它们的总和。
这是我的代码:
注意:下面显然不会编译,因为我仍然试图理解Teradata for C Arrays中的正确数据类型。
#define SQL_TEXT Latin_Text
#include <sqltypes_td.h>
#include <string.h>
#include <math.h>
typedef struct agr_storage {
int count;
ARRAY_HANDLE elements[100];
} AGR_Storage;
void SUM_REDEFINED( FNC_Phase phase,
FNC_Context_t *fctx,
FLOAT *x, //here im passing row element one by one
FLOAT *result,
int *x_i,
int *result_i,
char sqlstate[6],
SQL_TEXT fncname[129],
SQL_TEXT sfncname[129],
SQL_TEXT error_message[257] )
{
AGR_Storage *s1 = fctx->interim1;
switch (phase)
{
case AGR_INIT:
s1 = FNC_DefMem(sizeof(AGR_Storage));
if (s1 == NULL)
{
strcpy(sqlstate, "U0001");
return;
}
s1->count = 0;
s1->elements[100]={0};
case AGR_DETAIL:
if (*x_i != -1)
{
s1->count++;
s1->elemnts[s1->count]=*x;//appending elemts one by one
break;
case AGR_COMBINE:
case AGR_FINAL:
{
int no_of_elements=s1->count;
int i=0;
FLOAT sum=0;
for(i=0;i<no_of_elements;i++){
sum+=s1->elements[i]; //adding all the elements
}
*result = sum; //returning the sum
break;
}
case AGR_NODATA:
*result_i = -1;
break;
default:
/* If it gets here there must be an error because this */
/* function does not accept any other phase options */
strcpy(sqlstate, "U0005");
}
return;
}
答案 0 :(得分:-1)
我们可以像在C中一样在Teradata中声明数组。但是请记住,对于UDF,每个中间存储块空间限制为64个字节。因此,如果要定义整数数组,则不能使数组大于16个整数(整数需要4个字节16 * 4 = 64)。其他数据类型也是如此。
所以将代码更改为
typedef struct agr_storage {
int count;
int elements[*Number here*];
} AGR_Storage;
所有声明的数据类型的累积总和应小于64个字节。