【问题标题】:Calling PLsql script with an anonymous PL SQL block from SOCI使用来自 SOCI 的匿名 PL SQL 块调用 PLsql 脚本
【发布时间】:2017-09-08 06:38:08
【问题描述】:

我正在寻找一种通过 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 以检索数据。我试图通过soci::statement 执行上述操作,但它给了我错误:ORA-24333: zero iteration count。在 SqlPlus 中执行时,PLsql 脚本运行良好。

  1. 如何在语句和 参考 rc?我应该为此目的使用其他一些 SOCI 构造(语句除外)吗?
  2. 我明白上面有两条指令 脚本; (i. refcursor 创建,ii. 匿名 PLsql 块 本身)。我不确定是否可以调用多个 一条 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

【问题讨论】:

    标签: c++ oracle plsql soci


    【解决方案1】:

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

    如果这不可行,并且您使用的是 Oracle 12.1 或更高版本,您可以使用implicit result set 构造,类似于

    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?中所述

    【讨论】:

      猜你喜欢
      • 2014-09-30
      • 1970-01-01
      • 2015-08-25
      • 1970-01-01
      • 2017-06-09
      • 2017-09-02
      • 2021-05-17
      • 1970-01-01
      • 2017-01-29
      相关资源
      最近更新 更多