我从C到OCI进行了一些调用到Oracle数据库。
我收到此错误:
OCI_INVALID_HANDLE - 无效的服务上下文,连接或语句句柄
我继承了这段代码:
initOracle(..) { .. //return successful or 0 }
int executeGetQuery(char * query, char * queryResultData) {
char stmt[255];
OCIError *errhp;
OCIDefine *defnp = (OCIDefine *) 0;
OCIStmt *stmthp;
OCISvcCtx *svchp; //server context handle (almost like DBPROCESS)
sb2 is_null;
memset((char *)stmt, 0, 255);
//TODO replace with query
sprintf((char *)stmt, "SELECT min(ID) as MINID FROM BNS_SAA_CONFIRMATIONS where SentToWssStatus<>'T'");
/* prepare statement */
if( checkerr(errhp, OCIStmtPrepare(stmthp, errhp, (text *) stmt,
(ub4) strlen((char *) stmt),
(ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT)) == OCI_ERROR)
return -1;
/* define output params */
if(checkerr(errhp, OCIDefineByPos(stmthp, &defnp, errhp, 1, (dvoid *) queryResultData,
(sword) strlen(queryResultData), SQLT_STR, (dvoid *) &is_null, (ub2 *)0,
(ub2 *)0, OCI_DEFAULT)) == OCI_ERROR)//maybe replace SQLT_STR w SQLT_CHR OMFWTD
return -1;
/* execute the statement */
status = OCIStmtExecute(svchp, stmthp, errhp, (ub4) 1, (ub4) 0, (CONST OCISnapshot *) NULL, (OCISnapshot *) NULL, OCI_DEFAULT);
....
}
我认为错误出现在这些函数上:OCIStmtExecute(..)
或OCIDefineByPos(..)
或OCIStmtPrepare(..)
问题: 如何摆脱此错误并开始执行查询?
错误文档:http://docs.oracle.com/cd/B28359_01/appdev.111/b28395/oci02bas.htm
答案 0 :(得分:1)
嗯......我看到本地定义的OCI句柄没有正确分配和/或初始化。如果这些步骤是在您继承的其他代码中完成的,那么您需要确保有办法获取指向这些句柄的指针。如果没有,您链接到错误处理部分的Oracle文档都有很好的OCI编程介绍和深入的演示程序(您可能必须创建一个Oracle开发人员帐户并下载OCI客户端以获取它们'不是你可以到达的地方)。祝你好运,OCI是一个巨大的API,但是一旦你学会了如何浏览它,甲骨文自己的文档就很棒了,除了介绍我发现OCI Relational functions section(至少它相当于10g)是非常宝贵的。< / p>