2016-04-20 6 views
0

Ich versuche, eine UDF für IRR in Teradata zu erstellen.IRR (interne Rendite) UDF in TeraData

ich speichern möchten alle Elemente der Reihe in meinem Zwischenspeicher in Form von Array (einer nach dem anderen anhängt) .Diese mir helfen, die Elemente mehrere Male (geht mit Versuch und Irrtum Logik) zu verwenden

Ich möchte nur wissen, welcher kompatible Datentyp in "typedef" für diese Anforderung in Teradata verwendet wird?

Als IRR-Logik ist etwas, was lang ist, mein Problem hier mit Hilfe einer neuen sum_redefined-Funktion darstellt.

Ich versuche nur die Summe der übergebenen Argumente (Zeilenelemente) zu berechnen, indem ich sie in einem Array ablege und sie danach anfüge.

Hier ist mein Code:

Hinweis: Die unten offensichtlich gewohnt ist zu kompilieren, weil ich bin immer noch versuchen, den richtigen Datentyp in Teradata für C-Arrays zu verstehen.

#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

Haben Sie einen Beispielcode für das, was Sie bisher versucht haben? –

+0

@RobPaller Ich aktualisierte Frage mit meinem Problem .. Bitte lassen Sie mich wissen, wenn Sie weitere Details benötigen –

Antwort

-1

Wir Arrays in Teradata erklären können, wie wir in C tun, aber bitte beachten Sie, dass jeder Zwischenspeicherblock Platz für UDF auf 64 begrenzt ist bytes.so, wenn Sie ein Integer-Array definieren kippen Sie Array machen größer als 16 ganze Zahlen (Integer dauert 4 Bytes 16 * 4 = 64). Das Gleiche gilt für andere Datentypen.

So Ihr Code ändern zu

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

Die kumulierte Summe aller deklarierten Datentypen sollte weniger als 64 Byte sein.

+0

Die Größe eines * Zwischenspeicherblock * ist auf 64000 Bytes und nicht 64 Byte beschränkt: http: //www.info.teradata .com/htmlpubs/DB_TTU_15_10/index.html # Seite/SQL_Referenz/B035_1147_151K/C_UDFs.045.073.html – dnoeth