2017-04-12 6 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; 

私は、データを取得するために自分のアプリケーションから参照カーソルを読み取る必要があります。私はsoci::statementを通して上記を実行しようとしましたが、それは私にエラー:ORA-24333: zero iteration countを与えます。 PLsqlスクリプトは、SqlPlusで実行すると正常に動作します。

  1. 文と refcursor rcとの接続はどのようにすればよいですか?この目的のために他のSOCI構文(ステートメント以外)を使用する必要がありますか?
  2. 上記の スクリプトには2つの手順があります。 (つまり、refcursorの作成、ii。匿名のPLsqlブロック 自体)。 1つの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?

で説明したように、あなたが

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

の線に沿って、implicit result set建設を使用する可能性があります場合には

関連する問題