gpt4 book ai didi

c - TeraData 中的 IRR(内部 yield )UDF

转载 作者:行者123 更新时间:2023-11-30 18:12:20 26 4
gpt4 key购买 nike

我正在尝试为IRR创建一个UDF在 Teradata 中。

我想以数组的形式将 row 的所有元素存储在中间存储中(一次附加一个)。这有助于我多次使用这些元素(采用试错逻辑)

我只是想知道,“typedef”中使用哪种兼容数据类型来满足 teradata 中的此要求?

由于 IRR 逻辑有些冗长,我在新的 sum_redefine 函数的帮助下在这里代表我的问题。

我只是想通过将传递的参数(行元素)存储到数组中并随后添加它们来计算传递的参数(行元素)的总和。

这是我的代码:

注意:下面的内容显然无法编译,因为我仍在尝试了解 Teradata 中 C 数组的正确数据类型。

#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;
}

最佳答案

我们可以像在 C 中一样在 Teradata 中声明数组。但请记住,对于 UDF,每个中间存储 block 空间限制为 64 个字节。因此,如果您定义整数数组,则不能使数组大于 16 个整数(整数占用4个字节16*4=64)。其他数据类型也是如此。

因此将您的代码更改为

typedef struct agr_storage {
int count;
int elements[*Number here*];
} AGR_Storage;

所有声明的数据类型的累计总和应小于 64 字节。

关于c - TeraData 中的 IRR(内部 yield )UDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36743378/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com