1
参照カーソルの出力パラメータを持つストアドプロシージャがOracleデータベースにあるとします。OracleRefereceCursorはデータベースからどのようにデータを取得しますか?
私は以下のようにDBからデータを取得しようとしていますODP.Netを使用して.NETから(私はhttp://www.oracle.com/technetwork/articles/dotnet/williams-refcursors-092375.htmlからこれをとっている)
OracleCommand cmd = new OracleCommand("otn_ref_cursor.get_emp_info", con);
cmd.CommandType = CommandType.StoredProcedure;
// create parameter object for the cursor
OracleParameter p_refcursor = new OracleParameter();
// this is vital to set when using ref cursors
p_refcursor.OracleDbType = OracleDbType.RefCursor;
// this is a function return value so we must indicate that fact
p_refcursor.Direction = ParameterDirection.ReturnValue;
// add the parameter to the collection
cmd.Parameters.Add(p_refcursor);
// create a data adapter to use with the data set
OracleDataAdapter da = new OracleDataAdapter(cmd);
// create the data set
DataSet ds = new DataSet();
// fill the data set
da.Fill(ds);
どのデータセットがレコードを埋めるのですか?一度に1つのレコードを取得するためにデータベースサーバーへの1回のラウンドトリップを行いますか?
は、それは私がDBへの各行ごとに1往復を行いますDataReaderを使用してのアプローチは、私の理解が正しいと思い
OracleDataReader dr = cmd.ExecuteReader();
while (reader.Read())
{
//Do Something
}
と同じですか?
データベースへの各ラウンドトリップでフェッチされるデータの量は、特定のバイト数であるフェッチサイズによって制御されます。私はデフォルトのサイズを忘れています。これを制御するには、FetchSizeをRowsizeの倍数に設定します。 ODP.NETはデータをフェッチするまでデータをキャッシュします。 –
ありがとうございます@ChristianShay、それはデータを取得するためにDBへの往復回数が多すぎるという懸念に対応しています。 –
私は先に進み、それを答えとして加えました。 –