使用来自SOCI

时间:2017-04-12 12:58:29

标签: c++ oracle plsql soci

我正在寻找一种通过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. 如何在语句和语句之间建立连接 refcursor rc?我是否应该为此目的使用其他一些社会构建(声明除外)?
  2. 我知道上面有两条说明 脚本; (即,refcursor创建,ii。匿名PLsql块 本身)。我不确定它是否可以调用多个 单一社会责任声明中的说明。这可以确认吗?
  3. 以下是我的尝试。 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

1 个答案:

答案 0 :(得分:1)

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

如果这不可行,并且您使用的是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?

中讨论过