Oracle OCI C代码中的OCI_INVALID_HANDLE错误



OCIStmtFetch2函数在我的代码中执行时,我得到无效句柄的错误。

char *query = "SELECT id FROM id_table WHERE ROWNUM <= :1";
rc = OCIStmtPrepare(stmt, errhp, (OraText*)query, strlen(query), OCI_NTV_SYNTAX, OCI_DEFAULT);
OCIBind *bindp = NULL;
sb2 pos = 1;
int key=13;
rc = OCIBindByPos(stmt, &bindp, errhp, 1, &key, sizeof(int), SQLT_INT, (dvoid*)&pos, NULL, NULL, 0, NULL, OCI_DEFAULT);
char output[key][120];
sb2 output_ind[1];
ub2 output_len[1];
ub2 output_code[1];
OCIDefine *defnpp;
rc = OCIDefineByPos(stmt, &defnpp, errhp, 1, (dvoid*)output, 120, SQLT_STR, (dvoid*)output_ind, output_len, output_code, OCI_DEFAULT);
int rows = key;
/* execute */
rc = OCIStmtExecute(svchp, stmt, errhp, key, 0, NULL, NULL, OCI_DEFAULT);

rc = OCIStmtFetch2(stmt, errhp, 0, OCI_DEFAULT, 0, OCI_DEFAULT);

如果我将占位符:1与整数值12绑定,则代码工作,任何大于12的值在运行OCIStmtFetch2后给我Error OCI_INVALID_HANDLE错误。我有下面的代码来捕获错误,我在上面代码中提到的每个OCI函数之后运行它

if (rc != OCI_SUCCESS && rc != OCI_SUCCESS_WITH_INFO) {
  report_error(checkerr("Function Name()", errhp, rc));
  return 1;
}

谁能帮我什么是不正确的在我的代码?谢谢你!

对于大于12的任何值都不起作用,因为您将输出数组定义为char output[13][120]。我认为你已经从约阿希姆的评论,你的输出缓冲区是不够多行的想法。我将尝试回答您关于函数调用中的ind, rlen和rcode变量的后续问题-

rc = OCIDefineByPos(stmt, &defnpp, errhp, 1, (dvoid*)output, 120, SQLT_STR, (dvoid*)output_ind, output_len, output_code, OCI_DEFAULT);

OCIDefineByPos将选择列表中的项与类型和输出数据缓冲区相关联。

output_ind是指向指示符数组的指针。每个绑定和定义OCI调用都有一个参数,该参数将指示符变量或指示符变量数组与DML语句、PL/SQL语句或查询关联起来。在这里你可以了解更多关于指示符变量和它们的用法。

output_len是一个指向数据长度数组的指针。

output_code是指向列级返回码数组的指针。

最新更新