簡體   English   中英

從SOCI用匿名PL SQL塊調用PLsql腳本

[英]Calling PLsql script with an anonymous PL SQL block from 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之間建立連接? 我是否應該為此目的使用其他SOCI構造(除了語句)?
  2. 我了解以上腳本中有兩條指令; (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

語句variable rc refcursor既不是SQL也不是PL / SQL,而是Oracle SQL * Plus命令行實用程序和兼容的第三方產品的一部分。 我不了解C ++,但大概您需要在主機程序中定義ref游標對象。

如果這不可行,並且您使用的是Oracle 12.1或更高版本,則可能按照以下方式使用隱式結果集構造:

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

是否有可能從PL / SQL塊輸出SELECT狀態?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM