当尝试在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检查了所有其他指针,它们看起来相当不错。我可能错过了一些初始化吗?
答案 0 :(得分:4)
您忘了分配语句句柄。您传入stmthp
的变量OCIStmtPrepare
未初始化:
sword status = OCIHandleAlloc((dvoid *)envh,
(dvoid **) &stmthp,
(ub4) OCI_HTYPE_STMT,
(size_t) 0,
(dvoid **) 0));