sql - Oracle OCI C 代码中的错误 OCI_INVALID_HANDLE

标签 sql c oracle oracle-call-interface

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/

相关文章:

mysql - SQL ORDER BY 查询

SQL 按 ID 查找单独列中值仅为零的记录

oracle - xml选择查询oracle

database - DBCP 连接池登录超时

SQL 在某个日期后获取每个 ID 的最后一条记录

c++ - sqlite全局变量错误

c++ - 将多个文件 (gz) 通过管道传输到 C 程序中

c - printf 中变量地址的输出

c - 从 eclipse autotools 插件执行 automake

php - 具有多个属性的产品库存