Прочитать данные из хранимой процедуры 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);
Нравится
Добрый день, Михаил!
Вопрос достаточно интересный, поскольку необходимо создать реализацию для разного кол-ва полей. Возможно, если постановка задачи позволяет, все таки есть смысл сделать несколько реализаций, но каждая с фиксированным количеством полей.
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'ы по произвольным временным периодам с различными группировками - по дням, по неделям, ... , по годам. По вертикали - тоже значения из справочника, который меняется. Поэтому вариант - чтобы не гонять данные - генерация всего по максимуму на стороне БД - и отдача результата приложению курсором.