0

管理されたODP.Net with Enterprise Libraryを使用して、複数 (3) のストアド プロシージャを 1 つずつ実行しようとしています。各ストアド プロシージャは、それぞれ「 cur_out 」という名前のOUT カーソルを返します。奇妙なことに、最初のストアド プロシージャは常にレコードを返しますが、その後、残りの 2 つの SP に対して ExecuteDataSet() を呼び出してもレコードは返されません。これは System.Data.OracleClient で完全に機能するため、ストアド プロシージャ自体に問題がないことはわかっています。これらの SP が何も返さない理由がわかりません。以下は私のサンプルコードです:

DbCommand cmd = DB.GetStoredProcCommand("EBS_EOM_PKG.SP1");
                DB.AddInParameter(cmd, "PI_PARAM1", DbType.AnsiString);
                DB.SetParameterValue(cmd, "PI_PARAM1", param1);
                DB.AddInParameter(cmd, "PI_PARAM2", DbType.AnsiString);
                DB.SetParameterValue(cmd, "PI_PARAM2", param2);
                if (cmd is Oracle.ManagedDataAccess.Client.OracleCommand)
                {
                    OracleParameter cur = new OracleParameter("cur_out", 
                                          OracleDbType.RefCursor, 0, 
                                          ParameterDirection.Output, true, 
                                          0, 0, String.Empty, 
                                          DataRowVersion.Current, 
                                          Convert.DBNull);
                    cmd.Parameters.Add(cur);
                }
                DataSet dsSub = DB.ExecuteDataSet(cmd); <--WORKS i.e. returns records

         cmd = DB.GetStoredProcCommand("EBS_EOM_PKG.SP2");
                DB.AddInParameter(cmd, "PI_PARAM1", DbType.AnsiString);
                DB.SetParameterValue(cmd, "PI_PARAM1", param1);
                DB.AddInParameter(cmd, "PI_PARAM2", DbType.AnsiString);
                DB.SetParameterValue(cmd, "PI_PARAM2", param2);
                if (cmd is Oracle.ManagedDataAccess.Client.OracleCommand)
                {
                    OracleParameter cur = new OracleParameter("cur_out", 
                                          OracleDbType.RefCursor, 0, 
                                          ParameterDirection.Output, true, 
                                          0, 0, String.Empty, 
                                          DataRowVersion.Current, 
                                          Convert.DBNull);
                    cmd.Parameters.Add(cur);
                }
                DataSet dsSub1 = DB.ExecuteDataSet(cmd); <--FAILS i.e. no records returned
               DataTable dt1 = dsSub1.Tables[0];
               dsSub1.Tables.Remove(dt1);
               dt1.TableName = "Ported DataTable 1";//Provide name 
               explicitly to prevent name conflicts with existing datatable
               dsSub.Tables.Add(dt1);

       cmd = DB.GetStoredProcCommand("EBS_EOM_PKG.SP3");
                DB.AddInParameter(cmd, "PI_PARAM1", DbType.AnsiString);
                DB.SetParameterValue(cmd, "PI_PARAM1", param1);
                DB.AddInParameter(cmd, "PI_PARAM2", DbType.AnsiString);
                DB.SetParameterValue(cmd, "PI_PARAM2", param2);
                if (cmd is Oracle.ManagedDataAccess.Client.OracleCommand)
                {
                    OracleParameter cur = new OracleParameter("cur_out", 
                                          OracleDbType.RefCursor, 0, 
                                          ParameterDirection.Output, true, 
                                          0, 0, String.Empty, 
                                          DataRowVersion.Current, 
                                          Convert.DBNull);
                    cmd.Parameters.Add(cur);
                }
                DataSet dsSub2 = DB.ExecuteDataSet(cmd); <--FAILS i.e. no records returned

                DataTable dt2 = dsSub2.Tables[0];

                dsSub2.Tables.Remove(dt2);
                dt2.TableName = "Ported DataTable 2";//Provide name 
                explicitly to prevent name conflicts with existing datatable
                dsSub.Tables.Add(dt2);

誰かがここで何が欠けているか指摘できますか? 別の方法でできることはありますか?単一のストアド プロシージャで複数の参照カーソルを返す問題がある Oracle 12c DB を使用しているため、これらを個別に実行してから、結果を単一のデータセットに結合する必要があることに注意してください。

4

1 に答える 1