c++ - 使用来自 SOCI 的匿名 PL SQL block 调用 PLsql 脚本

标签 c++ oracle plsql soci

我正在寻找一种通过 SOCI 调用匿名 PLsql block 的方法。数据传输通过先前在脚本中创建为变量的 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 以检索数据。我试图通过 soci::statement 执行上述操作,但它给了我错误:ORA-24333:零迭代计数。 PLsql 脚本在 SqlPlus 中执行时工作正常。

  1. 我怎样才能在声明和 refcursor rc?为此,我是否应该使用其他一些 SOCI 结构(声明除外)?
  2. 我明白上面有两条指令 脚本; (i. refcursor 创建,ii. 匿名 PLsql block 本身)。我不确定是否可以调用多个 单个 SOCI 语句中的指令。这可以确认吗?

以下是我尝试过的。 sSQL 包含上述 PLsql 脚本:

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

最佳答案

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

如果这不可行,并且您使用的是 Oracle 12.1 或更高版本,则可以使用 implicit result set build ,沿着

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

Is it possible to output a SELECT state from a PL/SQL block? 中所述

关于c++ - 使用来自 SOCI 的匿名 PL SQL block 调用 PLsql 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43370251/

相关文章:

c++ - 更有效地迭代

c++ - 如何正确使用 boost::timed_mutex 和 scoped_lock

oracle - PL/SQL : For loop for select over a list

c++ - 创建自定义#warning 标志

c++ - C++ 中是否有类似 Haskell Data.Sequence 的东西?

sql - 过程创建所需的简单初学者 Oracle PL/SQL 帮助/修复

c# - 异步 I/O 密集型代码比非异步代码运行速度慢,为什么?

sql - 对于长时间运行的报告,我是使用只读事务还是可序列化事务?

sql - PL SQL 条件的正确编写方法

oracle - PIVOT,如何将非指定行转换为列?