c - 将参数传递给 Oracle 存储过程

标签 c oracle stored-procedures oracle-call-interface

这个问题之前可能有人问过,所以如果重复了,我很抱歉。如果您能链接到我能找到答案的地方,我将不胜感激。我查看了其他答案并在 Google 上查看,但似乎还没有任何效果。 所以……

我在 Oracle 11g 中有一个存储过程(我无法更改)并且我必须使用 OCI(此处别无选择)。

存储过程声明如下:

PROCEDURE GetEmployee(EID IN NUMBER, rcursor IN OUT cursor_type);

我如何在 C 中调用它?

我尝试使用 the OCI example here作为基础,将其修改为:

char * query =  "DECLARE \
     EID NUMBER; \
     RCURSOR CORP.EMPASSIST.cursor_type; \
     BEGIN \
       EID:= NULL; \
       RCURSOR := NULL; \
       EMPASSIST.GetEmployee( EID=> EID, RCURSOR => RCURSOR ); \
       :RCURSOR := RCURSOR; --<-- Cursor \
     END;";

OCIError * db_error;
OCIStmt * statement;
OCIEnv * environment;
OCIServer * server;
OCISession * session;
OCISvcCtx * service;

OCIBind * cursor_bind;
OCIBind * eid_bind;
OCIStmt * cursor_stm;
OCIStmt * eid_stm;

retval += OCIStmtPrepare(statement, db_error, (OraText *) query, strlen(query), OCI_NTV_SYNTAX, OCI_DEFAULT);
retval += OCIHandleAlloc(environment, (void **) &eid_stm, OCI_HTYPE_STMT, 0, NULL);
retval += OCIHandleAlloc(environment, (void **) &cursor_stm, OCI_HTYPE_STMT, 0, NULL);
retval += OCIBindByPos(statement, &eid_bind, db_error, 1, &eid_stm, 0, SQLT_NUM, NULL, 0, NULL, 0, 0, OCI_DEFAULT);
retval += OCIBindByPos(statement, &cursor_bind, db_error, 2, &cursor_stm, 0, SQLT_RSET, NULL, 0, NULL, 0, 0, OCI_DEFAULT);

retval += OCIStmtExecute(service, statement, db_error, 1, 0, NULL, NULL, OCI_COMMIT_ON_SUCCESS);

但这似乎对我不起作用。所有的句柄分配似乎都工作得很好。没有错误。

但是,它在 OCIStmtExecute 步骤上失败。之后我必须使用 BindByPos,它们也失败了,但我猜这是因为语句执行失败。

请帮忙!

============================================ ==============================

已修复:发布答案以防对其他人有帮助

最佳答案

如果您发布实际错误,将会有所帮助。

然而,与命名数据类型一样,绑定(bind) REF 是一个两步过程。首先,调用 OCIBindByName() 或 OCIBindByPos(),然后调用 OCIBindObject()。

REF 使用 SQLT_REF 数据类型绑定(bind)。当使用 SQLT_REF 时,被绑定(bind)的程序变量必须是 OCIRef * 类型。

通过继承和 REF 可替换性,您可以将 REF 值绑定(bind)到子类型实例,其中期望父类(super class)型的 REF。

关于c - 将参数传递给 Oracle 存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12013033/

相关文章:

java - hibernate 和存储过程

c - Linux 内核延迟,低于 jiffies,没有忙等待

c - 结构体指针中的 "dereferencing pointer to incomplete type”

C 没有得到正确的结果

sql - 引用匿名 block 中的游标

oracle - 如何转义 Oracle 中的保留字?

java - H2数据库是否兼容Oracle 'Insert All'语句?

mysql - 如何对 MySQL 过程进行故障排除 - 为什么循环达到最大运行次数?

MySQL - SQLSTATE 值

C段错误