OCI批量获取数据

来源:互联网 发布:程序员入门教程百度云 编辑:程序博客网 时间:2024/06/07 12:06

最近在写OCI获取数据的功能,OCI批量获取数据遇到了一些问题。

OCIStmt* pStmt = NULL;
       OCIStmt* pCur = NULL;


OCIHandleAlloc(m_pEnvHandle,(dvoid**)&pStmt,OCI_HTYPE_STMT,0,NULL);
OCIStmtPrepare(pStmt,m_pErrHandle,(const OraText *)sSql.c_str(),sSql.length(),OCI_NTV_SYNTAX,OCI_DEFAULT);
OCIHandleAlloc(m_pEnvHandle, (void **)(&pCur), OCI_HTYPE_STMT, 0, NULL);

OCIBindByPos(pStmt,&pBind, m_pErrHandle, outOrder, &pCur, 0,SQLT_RSET,

pIndicator, 0,NULL, 0,0,OCI_DEFAULT);

 OCIStmtExecute(m_pSvcHandle, pStmt, m_pErrHandle, 1, 0, NULL, NULL,
OCI_COMMIT_ON_SUCCESS) ;

上面是是参数的绑定和执行。

if ( CheckError(OCIDefineByPos(pCur,&m_lpDefine,
m_pErrHandle,col+1,(void*)m_pData,
(SQLT_BLOB == m_nDataType) ? -1 : m_nDataLen,
(SQLT_BLOB == m_nDataType) ? m_nDataType : SQLT_STR,
pArrIndicator,NULL,NULL,OCI_DEFAULT)) )
{
break;
}

上面这一步很重要,这里讲的是批量获取数据,所以指示器变量 pArrIndicator必须是数据的指针,因为这个指示器指示的是每一行的的每一列的指示的值,对于查询操             作是输出参数,所以这里一定要申请的是一个数据的指针,不然后面可能会导致程序内存越界而崩溃,而且崩溃了问题不好找。

   nStat =  OCIStmtFetch2(pCur,m_pErrHandle,ROWS,OCI_FETCH_NEXT,1,OCI_DEFAULT);这一步是执行批量获取数据,一次获取 ROWS行,获取的数据在m_pData里。如果nStat是OCI_SUCCESS,是获取这么多行成功。

   如果是OCI_NO_DATA可能是这次获取的行数不够ROWS行或数据已经获取完毕,通过函数OCIAttrGet(pCur,OCI_HTYPE_STMT,&nRows,(ub4*)NULL,OCI_ATTR_ROWS_FETCHED,m_pErrHandle)来得到本次获取的行数nRows。

本次就说到这里,主要是OCI批量获取数据需要注意的问题。


原创粉丝点击