当 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 绑定(bind),则代码可以工作,任何大于 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]
。我认为您已经从 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
将选择列表中的项目与类型和输出数据缓冲区相关联。
output_ind
这里是一个指向指标数组的指针。每个绑定(bind)和定义 OCI 调用都有一个参数,该参数将指示符变量或指示符变量数组与 DML 语句、PL/SQL 语句或查询相关联。 Here您可以了解更多有关指标变量及其用法的信息。
output_len
这里是指向所获取数据长度数组的指针。
output_code
这里是指向列级返回码数组的指针。
关于sql - Oracle OCI C 代码中的错误 OCI_INVALID_HANDLE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32655568/