Использование выходного параметра типа SYS_refcursor

#c# #stored-procedures #oracle10g #out-parameters #sys-refcursor

#c# #хранимые процедуры #oracle10g #out-параметры #sys-refcursor

Вопрос:

В моей базе данных у меня есть хранимая процедура с выходным параметром типа SYS_REFCURSOR. Сторона приложения написана на C #. Могу ли я назначить выходной параметр этой процедуры для Datatable, например:

  .............
 OracleConnection con=new OracleConnection(......);
 OracleCommand cmd=new OracleCommand("MyStoredProc",con);
 cmd.CommandType=CommandType.StoredProcedure;
 cmd.Parameters.Add("REC_CUR",OracleType.Cursor).Direction=ParameterDirection.Output;
 con.Open();
 cmd.ExecuteNonQuery();
 DataTable dt=(DataTable)cmd.Parameters["REC_CUR"].value;//is this legal?
  

Ответ №1:

Вот ответ на мой собственный вопрос. Если выходной параметр хранимой процедуры имеет тип SYS_REFCURSOR, то команда

 cmd.Parameters["REC_CUR"].value
  

вернет объект OracleDataReader, а не таблицу. И нет ни неявного, ни явного приведения из OracleDataReader в DataTable .

Комментарии:

1. Следует отметить, что нет неявного приведения из любого DataReader в DataTable (не только OracleDataReader). DataTable.Load (IDataReader) Вместо этого можно использовать метод. например DataTable dt = new DataTable(); dt.Load((OracleDataReader)cmd.Parameters["REF_CUR"].value);

2. Убедитесь, что вы не закрываете объект подключения, пока не закончите чтение данных или загрузку их в DataTable. Исключение не выдается, если ваш DataReader закрыт при вызове DataTable.Load .

Ответ №2:

Вы можете использовать OracleDataAdapter , как показано ниже,

пример кода с несколькими выходными параметрами с RefCursor :

 using (OracleCommand cmd = new OracleCommand("SP1", OraCon) { CommandType = System.Data.CommandType.StoredProcedure })
{
    var parm_nic = cmd.Parameters.Add("parm_nic", OracleDbType.NVarchar2);
    parm_nic.Value = msgBody;

    var pram_Name = cmd.Parameters.Add("pram_Name", OracleDbType.NVarchar2, 150, ParameterDirection.Output);
    var pram_PAdress = cmd.Parameters.Add("pram_PAdress", OracleDbType.NVarchar2, 150, ParameterDirection.Output);
    var output = cmd.Parameters.Add("pram_status", OracleDbType.RefCursor, ParameterDirection.Output);
    OraCon.Open();

    OracleDataAdapter ad = new OracleDataAdapter(cmd);
    OracleCommandBuilder cb = new OracleCommandBuilder(ad);

    DataTable dt = new DataTable();
    ad.Fill(dt);

    var address = pram_PAdress.Value;
    var name = pram_Name.Value;
}