Вопрос

Прочитать данные из хранимой процедуры ORACLE, возвращающей RefCursor

Коллеги, добрый день!

Как используя C# Terrasoft.DB.Oracle.OracleExecutor прочитать данные из хранимой процедуры ORACLE, возвращающей RefCursor с переменным количеством колонок?



Такой код работает:

         var conn = new Oracle.DataAccess.Client.OracleConnection(connString);

         string query = "BPM.SSBWSHPKG.OPEN_ONE_CURSOR";

         var cmd = new Oracle.DataAccess.Client.OracleCommand(query, conn);

         cmd.CommandType = CommandType.StoredProcedure;

            

         var param = new Oracle.DataAccess.Client.OracleParameter("IO_CURSOR",                                    Oracle.DataAccess.Client.OracleDbType.RefCursor, System.Data.ParameterDirection.Output);

         cmd.Parameters.Add(param);

            

         var da = new Oracle.DataAccess.Client.OracleDataAdapter(cmd);



         var ds = new DataSet();

         da.Fill(ds);

 

Нравится

2 комментария

Добрый день, Михаил!

Вопрос достаточно интересный, поскольку необходимо создать реализацию для разного кол-ва полей. Возможно, если постановка задачи позволяет, все таки есть смысл сделать несколько реализаций, но каждая с фиксированным количеством полей.

Terrasoft.DB.Oracle.OracleExecutor не позволяет работать с хранимками которые возвращают RefCursor.

Есть небольшой пример, как можно обойти все колонки: 

using (IDataReader dr = dbExecutor.ExecuteReader(sqlText, queryParameters)) {
 
       while (dataReader.Read()) {
 
              for (int i = 0; i < dataReader.FieldCount; i++) {
 
if (dbEngine.GetIsBinaryDataType(dataReader.GetDataTypeName(i))) {
                                  LoadColumnValue(dataReader.GetName(i), dataReader, i);
                                  continue;
                           }
                           LoadColumnValue(dataReader.GetName(i), dataReader[i]);
 
                     }
 
…

Сам sql текст при этом не просто вызов хранимки а приводится к

TABLE @"SELECT * FROM TABLE(""tspkg_CoreUtilities"".""tsp_GetSchPrntsInPkgHierByPkg""( " + ":SchemaUId, :StartSchemaUId, :WorkspaceId, :SysPackageId ))"

 

Спаибо за вопрос!

Большое Спасибо за ответ! Ваш вариант подходит!

У нас задача сделать Pivot'ы по произвольным временным периодам с различными группировками - по дням, по неделям, ... , по годам. По вертикали - тоже значения из справочника, который меняется. Поэтому вариант - чтобы не гонять данные - генерация всего по максимуму на стороне БД - и отдача результата приложению курсором.

Показать все комментарии