2017-04-12 35 views
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腳本可以正常工作。

  1. 如何在聲明和 refcursor rc之間建立連接?我是否應該爲此目的使用一些其他的SOCI構造(聲明除外)?
  2. 我明白在上面的 腳本中有兩條指令; (即,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

回答

1

聲明variable rc refcursor既不是SQL也不PL/SQL,但Oracle的SQL*Plus命令行實用程序的一部分,併兼容第三方產品。我不知道C++,但可能需要在主機程序中定義一個引用遊標對象。

如果這是不可行的,而你是在Oracle 12.1或更高版本,它可能是在Is it possible to output a SELECT state from a PL/SQL block?

討論,你可以使用一個 implicit result set建設,沿

declare 
    rc sys_refcursor; 
begin 
    open rc for select * from dual; 
    dbms_sql.return_result(rc); 
end;