C++ - migrated from 32 bit to 64 bit and getting unrelated sqlcode while dealing with Oracle DB [message #577997] |
Fri, 22 February 2013 09:00 |
|
najmaaaa
Messages: 6 Registered: February 2013
|
Junior Member |
|
|
Hi,
Previously we had 32 bit C++. Now, we have migrated it to 64 bit. And our C++ programs interact with Oracle 10g DB.
Our C++ program was working fine with 32 bit. But once after we migrate to 64 bit we are facing problem with one program which does FETCH(EXEC SQL FETCH SUBP1 INTO :newTabRec;) from Oracle DB. ie,
We exit from a for loop in the C++ program when we get NOT FOUND(sqlca.sqlcode=1403) on executing the FETCH statement.
The sqlcode generated for NOT FOUND scenario is 1403. But, once after moving to 64 bit C++, we do not see the sqlcode 1403 instead we are seeing a different code 7124089117159473.
As the sqlcode is not 1403, our program does not exit from the for loop and goes on an infinite loop.
Am I missing anything that makes me to not get the exact sqlcode?
|
|
|
|
|
|
Re: C++ - migrated from 32 bit to 64 bit and getting unrelated sqlcode while dealing with Oracle DB [message #578009 is a reply to message #578005] |
Fri, 22 February 2013 12:32 |
|
najmaaaa
Messages: 6 Registered: February 2013
|
Junior Member |
|
|
Hello Michel,
In the below code, we are looking for sqlca.sqlcode == 1403 and when it is met, we exit the loop. But, once after this upgrade, we do not get the sqlcode 1403. We are getting a different number(7124089117159473). Hence, it does not break the loop.
/* EXEC SQL WHENEVER NOT FOUND DO break; */
for (;;)
{
memset(newTabRec.INPUT.arr, 0, sizeof(newTabRec.INPUT.arr));
newTabRec.INPUT.len = 0;
newTabRec.INPUT.arr[newTabRec.INPUT.len] = '\0';
memset(newTabRec.OUTPUT.arr, 0, sizeof(newTabRec.OUTPUT.arr));
newTabRec.OUTPUT.len = 0;
newTabRec.OUTPUT.arr[newTabRec.OUTPUT.len] = '\0';
/* EXEC SQL FETCH SUBP1 INTO :newTabRec; */
{
struct sqlexd sqlstm;
sqlorat((void **)0, &sqlctx, &oraca);
sqlstm.sqlvsn = 12;
sqlstm.arrsiz = 4;
sqlstm.sqladtp = &sqladt;
sqlstm.sqltdsp = &sqltds;
sqlstm.iters = (unsigned int )1;
sqlstm.offset = (unsigned int )100;
sqlstm.selerr = (unsigned short)1;
sqlstm.cud = sqlcud0;
sqlstm.sqlest = (unsigned char *)&sqlca;
sqlstm.sqlety = (unsigned short)256;
sqlstm.occurs = (unsigned int )0;
sqlstm.sqfoff = ( int )0;
sqlstm.sqfmod = (unsigned int )2;
sqlstm.sqhstv[0] = (unsigned char *)&newTabRec.INPUT;
sqlstm.sqhstl[0] = (unsigned long )4002;
sqlstm.sqhsts[0] = ( int )0;
sqlstm.sqindv[0] = ( short *)0;
sqlstm.sqinds[0] = ( int )0;
sqlstm.sqharm[0] = (unsigned long )0;
sqlstm.sqadto[0] = (unsigned short )0;
sqlstm.sqtdso[0] = (unsigned short )0;
sqlstm.sqhstv[1] = (unsigned char *)&newTabRec.OUTPUT;
sqlstm.sqhstl[1] = (unsigned long )4002;
sqlstm.sqhsts[1] = ( int )0;
sqlstm.sqindv[1] = ( short *)0;
sqlstm.sqinds[1] = ( int )0;
sqlstm.sqharm[1] = (unsigned long )0;
sqlstm.sqadto[1] = (unsigned short )0;
sqlstm.sqtdso[1] = (unsigned short )0;
sqlstm.sqphsv = sqlstm.sqhstv;
sqlstm.sqphsl = sqlstm.sqhstl;
sqlstm.sqphss = sqlstm.sqhsts;
sqlstm.sqpind = sqlstm.sqindv;
sqlstm.sqpins = sqlstm.sqinds;
sqlstm.sqparm = sqlstm.sqharm;
sqlstm.sqparc = sqlstm.sqharc;
sqlstm.sqpadto = sqlstm.sqadto;
sqlstm.sqptdso = sqlstm.sqtdso;
sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
if (sqlca.sqlcode == 1403) break;
if (sqlca.sqlcode < 0) (retVal=sql_error("ORACLE error:"));
}
newTabRec.INPUT.arr[newTabRec.INPUT.len] = '\0';
newTabRec.OUTPUT.arr[newTabRec.OUTPUT.len] = '\0';
inpRetVal = string((char *)newTabRec.INPUT.arr);
outRetVal = string((char *)newTabRec.OUTPUT.arr);
subsTabValues[inpRetVal] = outRetVal;
if(!retVal)
break;
}
/* EXEC SQL CLOSE SUBP1; */
|
|
|
|
|
|
|
|