我正在寻找一种通过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:零迭代计数.在SqlPlus中执行时,PLsql脚本工作正常.
>如何在语句和语句之间建立连接
refcursor rc?我是否应该为此目的使用其他一些社会建构(声明除外)?
>我知道上面有两条说明
脚本; (即,refcursor创建,ii.匿名PLsql块
本身).我不确定它是否可以调用多个
单一社会责任声明中的说明.这可以证实吗?
以下是我试过的. 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
最佳答案 语句变量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?所述