使用oci方式查询数据,程序没有报错,但就是查询不到数据,哪位知道什么原因?下面是程序代码:
int sqlBindPara( void *con, GHashTable *paraGHashTable ) {
int rc;
ST_ORA_CONN_INFO *stOraConnInfo;
GList *keys;
gpointer data;
OCIBind   *defnp1; stOraConnInfo = ( ST_ORA_CONN_INFO * ) con;
keys = NULL == paraGHashTable ? NULL : g_hash_table_get_keys( paraGHashTable );
while( NULL != keys ) {
data = g_hash_table_lookup ( paraGHashTable, ( char * ) keys->data );
rc = OCIBindByName( stOraConnInfo->stmt, &defnp1, stOraConnInfo->err, 
(char *)keys->data, strlen( ( char * ) keys->data ), 
data, strlen( data ) + 1, SQLT_STR, 0, 0, 
0, 0, 0, OCI_DEFAULT );
if( OCI_SUCCESS != rc ) {
checkerr( stOraConnInfo->err, rc );
return -10;
}
OCIHandleFree( ( dvoid * )( defnp1 ),( ub4 ) OCI_HTYPE_BIND );
keys = g_list_next( keys );
}
return OCI_SUCCESS;
}
int sqlExecSelect( void *con, char *sql, GHashTable *paraGHashTable, GSList *resList ) {
int rc;
ST_ORA_CONN_INFO *stOraConnInfo;
int numCols, i;
OCIParam *colhd = (OCIParam *) 0;
ub2 type = 0, col_width;
text *col_name;
ub4 col_name_len;
ub1 char_semantics;
ST_PLACEHOLDERS_INFO *pstData;
g_message( "select ...\nsql->%s", sql );
stOraConnInfo = ( ST_ORA_CONN_INFO * ) con;
rc = OCIStmtPrepare( stOraConnInfo->stmt, stOraConnInfo->err, sql, strlen( sql ),
OCI_NTV_SYNTAX, OCI_DEFAULT );
if( OCI_SUCCESS != rc ) {
checkerr( stOraConnInfo->err, rc );
return -10;
}
rc = sqlBindPara( con, paraGHashTable );
if( OCI_SUCCESS != rc ) {
checkerr( stOraConnInfo->err, rc );
return -11;
}
rc = OCIStmtExecute( stOraConnInfo->svc, stOraConnInfo->stmt, stOraConnInfo->err,
0, 0, NULL, NULL, OCI_DESCRIBE_ONLY );
if( OCI_SUCCESS != rc ) {
checkerr( stOraConnInfo->err, rc );
return -12;
} rc = OCIAttrGet((dvoid *)stOraConnInfo->stmt, OCI_HTYPE_STMT, (dvoid *)&numCols,
(ub4 *)0, OCI_ATTR_PARAM_COUNT, stOraConnInfo->err );
if( OCI_SUCCESS != rc ) {
checkerr( stOraConnInfo->err, rc );
return -13;
}
g_message( "numCols->%d\n", numCols );    pstData = malloc( sizeof( ST_PLACEHOLDERS_INFO ) * numCols );
if( NULL == pstData ) {
g_message( "malloc error:%d->%s", errno, strerror( errno ) );
return -1301;
}
for( i = 1; i <= numCols; i ++ ) {
rc = OCIParamGet((dvoid *)(dvoid *)stOraConnInfo->stmt, 
          OCI_HTYPE_STMT, stOraConnInfo->err, (dvoid **)&colhd, i);
    if( OCI_SUCCESS != rc ) {
     checkerr( stOraConnInfo->err, rc );
freePData( pstData, numCols );
     return -14;
    }
rc = OCIAttrGet((dvoid*) colhd, (ub4) OCI_DTYPE_PARAM, (dvoid**) &col_name, 
                (ub4 *) &col_name_len, (ub4) OCI_ATTR_NAME,
                        (OCIError *) stOraConnInfo->err );
    if( OCI_SUCCESS != rc ) {
     checkerr( stOraConnInfo->err, rc );
freePData( pstData, numCols );
     return -15;
    }
rc = OCIAttrGet((dvoid *)colhd, OCI_DTYPE_PARAM, 
                (dvoid *)&type, (ub4 *)0, OCI_ATTR_DATA_TYPE, 
stOraConnInfo->err);
    if( OCI_SUCCESS != rc ) {
     checkerr( stOraConnInfo->err, rc );
freePData( pstData, numCols );
     return -16;
    }
rc = OCIAttrGet((dvoid*)colhd, (ub4) OCI_DTYPE_PARAM,
           (dvoid*) &char_semantics,(ub4 *) 0, (ub4) OCI_ATTR_CHAR_USED,
   (OCIError *) stOraConnInfo->err);
    if( OCI_SUCCESS != rc ) {
     checkerr( stOraConnInfo->err, rc );
freePData( pstData, numCols );
     return -17;
    }
if( char_semantics ) {
rc = OCIAttrGet((dvoid*)colhd, (ub4) OCI_DTYPE_PARAM,
               (dvoid*) &col_width, (ub4 *) 0, (ub4) OCI_ATTR_CHAR_SIZE,
   (OCIError *) stOraConnInfo->err );
} else {
rc = OCIAttrGet((dvoid*)colhd, (ub4) OCI_DTYPE_PARAM,
               (dvoid*) &col_width,(ub4 *) 0, (ub4) OCI_ATTR_DATA_SIZE,
   (OCIError *) stOraConnInfo->err );
}
    if( OCI_SUCCESS != rc ) {
     checkerr( stOraConnInfo->err, rc );
freePData( pstData, numCols );
     return -18;
    } g_message( "col->%s char_semantics->%d type->%d len->%d", 
            col_name, ( int )char_semantics, type, col_width );
switch( type ) {
case SQLT_CHR:
pstData[ i - 1 ].data.strData = malloc( col_width + 1 );
if( NULL == pstData[ i - 1 ].data.strData ) {
g_message( "malloc error:%d->%s", errno, strerror( errno ) );
freePData( pstData, numCols );
return -1801;
}
rc = OCIDefineByPos(stOraConnInfo->stmt, &stOraConnInfo->def, 
             stOraConnInfo->err, i, (dvoid *) pstData[ i - 1 ].data.strData,
 (sb4) col_width+1,
 SQLT_STR, (dvoid *) &pstData[ i - 1 ].ind, (ub2 *) 0,
(ub2 *) 0, OCI_DEFAULT);
pstData[ i - 1 ].type = SQLT_CHR;
break;
case SQLT_DAT:
pstData[ i - 1 ].data.strData = malloc( 10 + 1 );
if( NULL == pstData[ i - 1 ].data.strData ) {
g_message( "malloc error:%d->%s", errno, strerror( errno ) );
freePData( pstData, numCols );
return -1801;
}
rc = OCIDefineByPos(stOraConnInfo->stmt, &stOraConnInfo->def, 
             stOraConnInfo->err, i, (dvoid *) pstData[ i - 1 ].data.strData,
 (sb4) 10+1,
 SQLT_STR, (dvoid *) &pstData[ i - 1 ].ind, (ub2 *) 0,
(ub2 *) 0, OCI_DEFAULT);
pstData[ i - 1 ].type = SQLT_DAT;
break;
case SQLT_NUM:
rc = OCIDefineByPos(stOraConnInfo->stmt, &stOraConnInfo->def, 
             stOraConnInfo->err, i, (dvoid *) &pstData[ i - 1 ].data.dData,
 (sb4) sizeof( double ),
 SQLT_STR, (dvoid *) 0, (ub2 *) 0,
(ub2 *) 0, OCI_DEFAULT);
pstData[ i - 1 ].type = SQLT_NUM;
break; }
if( OCI_SUCCESS != rc ) {
    checkerr( stOraConnInfo->err, rc );
freePData( pstData, numCols );
return -19;
}
}
rc = OCIStmtExecute ( stOraConnInfo->svc, stOraConnInfo->stmt,
  stOraConnInfo->err, 1, 0, NULL, NULL,OCI_DEFAULT );
if( OCI_SUCCESS != rc ) {
    checkerr( stOraConnInfo->err, rc );
freePData( pstData, numCols );
return -1901;
}
while( 1 ) {
rc = OCIStmtFetch ( stOraConnInfo->stmt,stOraConnInfo->err,1, 
OCI_FETCH_NEXT, OCI_DEFAULT ); 
if( OCI_NO_DATA == rc ) {
g_message( "OCI_NO_DATA" );
break;
} else if( OCI_SUCCESS != rc ) {
    checkerr( stOraConnInfo->err, rc );
freePData( pstData, numCols );
return -20;
}
for( i = 0; i < numCols; i ++ ) {
switch( type ) {
case SQLT_CHR:
g_message( "char -> %s", pstData[ i - 1 ].data.strData );
break;
case SQLT_DAT:
g_message( "date -> %s", pstData[ i - 1 ].data.strData );
break;
case SQLT_NUM:
g_message( "num -> %.2f", pstData[ i - 1 ].data.dData );
break; }
}
} return OCI_SUCCESS;
}

解决方案 »

  1.   

    这种逻辑错误如果有集成调试环境的话最好通过单步执行来跟踪一下每步的执行情况,
    如果没有,可以通过printf语句来输出一些中间结果,缩小问题查找范围
      

  2.   

    程序没有报错,是不是sql查询不到结果集啊,把sqlprintf出来,然后拿到oracle里面去直接执行,看看有没有结果。另外没有报错是不是你没有抛出错误啊?
      

  3.   

    查询sql:select count(*) from tab,没有任何输入参数。每一步都做错误检查了。
      

  4.   

    自己找到原因了,问题出在OCIStmtExecute这个函数上,没有仔细看文档,造成理解不错误。