c - OCI_INVALID_HANDLE - 无效的服务上下文、连接或语句句柄

标签 c oracle oracle-call-interface

我通过 OCI 从 C 调用一些 Oracle 数据库。

我收到此错误:

OCI_INVALID_HANDLE - Invalid service context, connection or statement 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

最佳答案

嗯...我发现本地定义的 OCI 句柄没有被正确分配和/或初始化。如果这些步骤是在您继承的其他代码中完成的,您将需要确保有一种方法来获取指向这些句柄的指针。如果没有,您链接到错误处理部分的 Oracle 文档既有 OCI 编程的精彩介绍,也有深入的演示程序(您可能需要创建一个 Oracle 开发人员帐户并下载 OCI 客户端才能获取它们,如果它们不是您可以访问的地方)。祝你好运,OCI 是一个巨大的 API,但是一旦您学会了如何浏览它,Oracle 自己的文档就很棒,除了我找到的 OCI Relational functions section 的介绍之外。 (至少相当于 10 克)无价之宝。

关于c - OCI_INVALID_HANDLE - 无效的服务上下文、连接或语句句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9471483/

相关文章:

c - 抑制内联警告

c++ - 在 ORACLE 中使用 OCI(c++) 插入查询的问题

c - 以最有效的方式逐行阅读*平台特定*

sql - Instr - 最后一个字符的最后索引

java - stmt.executeUpdate() 返回 java.sql.SQLException : ORA-01722: invalid number

MySQL自动增量加上一列中的字母数字

c++ - windows上qt连接oracle数据库

php - OCI8 + PHP7.1 + Windows10 : The specified module could not be found

c - growl 通知 C

java - NDK : Does GetByteArrayElements copy data from Java to C++?