2010-03-01 6 views
0

Je compilé quelques UDFs sur Linux 64 bits qui ont été initialement AIX compilé surMigration de DB2 AIX à partir UDFs Linux (RHEL)

Linux est en cours d'exécution IBM DB2 v9.5

Voici la fonction que, parfois, retours pour certaines valeurs

#include <cstdlib> 
#include <cstdio> 
#include <iostream> 
#include "cbudf.hpp" 


using namespace std; 

extern "C" 
void SQL_API_FN cbzdt(SQLUDF_VARCHAR_FBD *pArg, 
         SQLUDF_VARCHAR *pResult, 
         SQLUDF_NULLIND *pArgInd, 
         SQLUDF_NULLIND *pResultInd, 
         SQLUDF_CHAR *pSqlState, 
         SQLUDF_VARCHAR *pFuncName, 
         SQLUDF_VARCHAR *pSpecName, 
         SQLUDF_VARCHAR *pMsgTxt) 
{ 
short i; 
unsigned long x = 0; 

cout << "entered cbzdt"; 

if (pArg->length < CM_UDF_ZDT_SIZE){ 
    *pResultInd = CM_UDF_IS_NULL_IND; 
    cout << "pArg length is:" << pArg->length << " and that is smaller than CM_UDF_ZDT_SIZE: " << CM_UDF_ZDT_SIZE; 
    } 
else 
    { 
    cout << "entered else"; 
    for (i = 0; i < 4; i++) 
     x = (x << 8) | pArg->data[i]; 
    if (x & 0xff000000){ 
     *pResultInd = CM_UDF_IS_NULL_IND; 
     cout << "x mask is true.. making null"; 
     } 
    else 
     { 
     cout << "entered nested else"; 
     *pResultInd = CM_UDF_NOT_NULL_IND; 
     CtDate zDate(x); 
//  strcpy(pResult, (const char *)(zDate.asString("%Y-%m-%d"))); 
     strncpy(pResult, (const char *)(zDate.asString("%Y-%m-%d")),11); 
     if (pResult[0] == '3'){    // if year is 3000 
     pResult[9] = '1';    // fix day 
     cout << "pResult =1"; 
     } 
     } 
    } 
} 

Et voici les données:

COID_      TIMESTAMP_     CHANGE_DATE     
-------------------------- -------------------------- --------------------------- 
1814    2010-02-17-15.44.22.995784 x'0025780F000000000804011B' 
1814    2010-02-17-15.44.55.583734 x'0025780F000000000804011B' 
1814    2010-02-17-15.46.09.929014 x'0025780F000000000804011B' 
1324    2009-12-02-21.31.13.058337 x'0025769F000000000804011B' 
1324    2009-12-02-21.32.47.387150 x'0025769F000000000804011B' 
1324    2009-12-02-21.34.03.020405 x'0025769F000000000804011B' 
1324    2009-12-08-19.54.13.492488 x'002576A1000000000804011B' 
1324    2009-12-08-19.55.22.041794 x'002576A1000000000804011B' 
1358    2009-12-09-15.14.05.593887 x'002576A1000000000804011B' 



After function applied: 

COID_      TIMESTAMP_     3   
-------------------------- -------------------------- ---------- 
1814    2010-02-17-15.44.22.995784 2011-01-05 
1814    2010-02-17-15.44.55.583734 2011-01-05 
1814    2010-02-17-15.46.09.929014 2011-01-05 
1324    2009-12-02-21.31.13.058337 -   
1324    2009-12-02-21.32.47.387150 -   
1324    2009-12-02-21.34.03.020405 -   
1324    2009-12-08-19.54.13.492488 -   
1324    2009-12-08-19.55.22.041794 -   
1358    2009-12-09-15.14.05.593887 -   

Est-ce qu'un Quelqu'un a des idées?

Je pense que cette instruction if:

if (x & 0xff000000){ 
      *pResultInd = CM_UDF_IS_NULL_IND; 

est vrai sur certains reviennent valeurs. Pourrait-il être quelque chose lié à 64bit?

Aussi les Couts ne sont pas imprimées dans la sortie de DB2

Merci

Répondre

0

Quelles sont les règles pour la conversion d'une partie de la zDate binaire à une date utilisable? Vous pourriez probablement trouver une fonction de conversion équivalente dans SQL et éviter complètement la fonction UDF compilée externe. La fonction HEX va convertir la valeur binaire en une chaîne hexadécimale, que vous pouvez ensuite parcourir avec SUBSTR pour construire votre valeur entière. En ce qui concerne les messages cout, je ne pense pas que cout va être très utile dans un fichier UDF externe. Vous aurez plus de chance d'enregistrer vos informations de débogage dans un fichier local.

Questions connexes