4
我正在尋找一種通過SOCI調用匿名PLsql塊的方法。使用來自SOCI的匿名PL SQL塊調用PLsql腳本
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腳本可以正常工作。
- 如何在聲明和 refcursor rc之間建立連接?我是否應該爲此目的使用一些其他的SOCI構造(聲明除外)?
- 我明白在上面的 腳本中有兩條指令; (即,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