IRR(内部收益率)TeraData中的UDF

时间:2016-04-20 12:10:55

标签: c arrays teradata

我试图在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;
} 

1 个答案:

答案 0 :(得分:-1)

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

所以将代码更改为

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

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