私は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で実行すると正常に動作します。
- 文と refcursor rcとの接続はどのようにすればよいですか?この目的のために他のSOCI構文(ステートメント以外)を使用する必要がありますか?
- 上記の スクリプトには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の