c - OCIStmtPrepare 总是返回 OCI_INVALID_HANDLE

标签 c oracle oracle11g

当尝试在 Oracle RDBMS 上执行语句时,我总是得到 OCI_INVALID_HANDLE 作为状态(使用 gdb 检查),因此语句未执行。

可能有人可以帮助完成这项工作:

OCIEnv* envh;
OCISvcCtx* svch;
OCIError* errh;
sword stat;
stat = OCIExtProcGetEnv (context, &envh, &svch, &errh);
OCIStmt* stmthp;

char errbuf[512];
sb4 errcode = 0;

char * cmd = "alter session set NLS_DATE_FORMAT='dd/mm/yyyy hh24:mi:ss'";

sword status = OCIStmtPrepare(stmthp, errh, (const OraText*)cmd, (ub4) strlen(cmd), (ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT);

if ( status != OCI_SUCCESS )
{
    OCIErrorGet((void*)errh, (ub4) 1, (text *) NULL, &errcode,
            (text*)errbuf, (ub4) sizeof(errbuf), OCI_HTYPE_ERROR);
    OCIExtProcRaiseExcpWithMsg((OCIExtProcContext*)context, errcode, (text*)errbuf, sizeof(errbuf));    
}

context 是从 PL/SQL 传递到此外部过程的 OCIExProcContext*

一个简单的 OCIExtProcRaiseExcpWithMsg((OCIExtProcContext*)context, 34, (text*)"custom", 6); 可以正常工作。此外,我用 gdb 检查了所有其他指针,它们看起来相当不错。我可以错过一些初始化吗?

最佳答案

您忘记分配语句句柄。您传递给 OCIStmtPrepare 的变量 stmthp 未初始化:

sword status = OCIHandleAlloc((dvoid *)envh, 
                 (dvoid **) &stmthp,
                 (ub4) OCI_HTYPE_STMT,  
                 (size_t) 0, 
                 (dvoid **) 0));

关于c - OCIStmtPrepare 总是返回 OCI_INVALID_HANDLE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12165792/

相关文章:

sql - Oracle select 查询出现内部 select 查询错误

c - 数组指针已初始化,但无法为其分配任何值?程序

c++ - 使用 Visual Studio 2008 从 x86 编译 x64 dll : unresolved external __imp_ symbols

java - 如何为一个数据库写2个ip?

c# - 更新查询时出错 - Visual Studio 2010 - Oracle 11g Express 版

sql - Oracle SQL 如何对静态数据集执行集合操作?

c - fmemopen 正在更改映射文件结构

c - STM32F4 EXTI0 中按钮按下后的延迟

sql - 如何从具有条件的另一列创建 bool 列

oracle - 如何获取 Mirth Connect 的 HL7 模板?