【发布时间】: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 脚本运行良好。
- 如何在语句和 参考 rc?我应该为此目的使用其他一些 SOCI 构造(语句除外)吗?
- 我明白上面有两条指令 脚本; (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
【问题讨论】: