Oracle OCI C 代码中的错误 OCI_INVALID_HANDLE

Error OCI_INVALID_HANDLE in Oracle OCI C Code

在我的代码中执行 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 的值都会在 运行ning 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]。我认为您已经从 Joachim 的评论中了解到您的输出缓冲区不足以容纳更多行。 我将尝试在函数调用中回答您关于 ind、rlen 和 rcode 变量的后续问题 -

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

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

output_ind 这里是一个指向指标数组的指针。每个绑定和定义 OCI 调用都有一个参数,该参数将指示变量或指示变量数组与 DML 语句、PL/SQL 语句或查询相关联。 Here您可以了解更多指标变量及其用法。

output_len 这里是一个指向所获取数据长度数组的指针。

output_code 这里是指向列级 return 代码数组的指针。