4

我正在寻找一种通过 SOCI 调用匿名 PLsql 块的方法。数据传输通过之前在脚本中作为变量创建的 refcursor 进行:

variable rc refcursor
declare
   v_obj_id number(4,0) := 1;
   v_obj_def varchar(30);
   v_obj_type number := 1;
begin
  open :rc for
     select v_obj_id, OBJ_DEF_ID
     from MY_OBJECT_DEFS
     where OBJECT_TYPE = v_obj_type;
end;

我需要从我的应用程序中读取 refcursor 来检索数据。我试图通过 a 执行上述操作,soci::statement但它给了我错误:ORA-24333: zero iteration count。PLsql 脚本在 SqlPlus 中执行时工作正常。

  1. 如何在语句和 refcursor rc 之间建立联系?我应该为此目的使用其他一些 SOCI 构造(语句除外)吗?
  2. 我知道上面的脚本中有两条指令;(i. refcursor 创建,ii. 匿名 PLsql 块本身)。我不确定是否可以在单个 SOCI 语句中调用多个指令。这可以确认吗?

以下是我尝试过的。包含上面的sSQLPLsql 脚本:

dbConn.open("...");
int iObjId;
std::string iObjDefId;
soci::indicator ind_iObjId = soci::i_ok,
        ind_iObjDefId = soci::i_ok;

soci::statement stmt(dbConn);
stmt.alloc();
stmt.prepare(sSQL);
stmt.exchange(soci::into(iObjId, ind_iObjId));
stmt.exchange(soci::into(iObjDefId, ind_iObjDefId));
stmt.define_and_bind();
stmt.execute(false);

while (stmt.fetch())
{
    if (soci::i_ok == ind_iObjId)
        std::cout << "Obj ID: " << iObjId << std::endl;

    if (soci::i_ok == ind_iObjDefId)
        std::cout << "Obj Def ID: " << iObjDefId << std::endl;
}

编辑:我正在使用 Oracle 11g

4

1 回答 1

1

该语句variable rc refcursor既不是 SQL 也不是 PL/SQL,而是 Oracle 的SQL*Plus命令行实用程序和兼容的第三方产品的一部分。我不知道 C++,但大概你需要在主机程序中定义一个 ref 游标对象。

如果这不可行,并且您使用的是 Oracle 12.1 或更高版本,则可以使用隐式结果集构造,类似于

declare
    rc sys_refcursor;
begin
    open rc for select * from dual;
    dbms_sql.return_result(rc);
end;

正如在是否可以从 PL/SQL 块中输出 SELECT 状态中所讨论的那样

于 2017-04-17T12:05:40.177 回答