Oracle sys_refcursor из обычного SQL

У меня есть (упрощенный) Oracle SQL, например:

declare
  xd number;
  xm number;
  DataOut sys_refcursor;
begin
  xd := to_number(to_char(sysdate, 'dd'));
  xm := to_number(to_char(sysdate, 'mm'));

  open DataOut for
  select * from dual;  
end;

И я хочу иметь возможность заполнять DataTable в .Net из данных, возвращенных в параметре DataOut.

Я пробовал разные вещи, но не могу получить доступ к курсору DataOut. Как бы я назвал это?

OracleCommand c = new OracleCommand();
c.CommandType = CommandType.Text;
c.CommandText = SQL;

OracleParameter param = new OracleParameter();
param.Direction = ParameterDirection.Output;
param.OracleType = OracleType.Cursor;
param.ParameterName = "DataOut";
c.Parameters.Add(param);

c.Connection = (OracleConnection) this.GetConnection();

OracleString rowNum = "";
c.ExecuteOracleNonQuery(out rowNum);
// or c.ExecuteReader()
// or use OracleDataAdapter

DataTable returnTable = /* magic goes here */

Я могу редактировать SQL, но не могу создавать функции или процедуры. Это возможно?


person Gunnar Steinn    schedule 18.05.2012    source источник
comment
Вы слишком упростили свой пример? Вы знаете, что блок PL/SQL ничего не возвращает?   -  person Ben    schedule 21.05.2012
comment
Что ж, я не специалист по Oracle, но мой клиент прислал мне этот образец и сказал, что я должен получить данные из переменной DataOut.   -  person Gunnar Steinn    schedule 21.05.2012
comment
Могу ли я изменить его на возвращаемое значение? Как бы я это сделал? Спасибо :) Я действительно потерялся здесь!   -  person Gunnar Steinn    schedule 21.05.2012


Ответы (1)


Анонимный блок PL/SQL ничего не возвращает, поэтому вы не сможете использовать курсор, открытый в анонимном блоке PL/SQL, в клиентском приложении. Чтобы вернуть данные клиентскому приложению, вам потребуется использовать именованный блок PL/SQL (то есть хранимую процедуру или хранимую функцию). Если вам не разрешено создавать именованные блоки PL/SQL, вы не сможете вернуть курсор, открытый в PL/SQL, в клиентское приложение.

person Justin Cave    schedule 20.05.2012
comment
Большое спасибо. Но могу ли я как-то решить эту проблему, есть ли способ получить что-то из sys_refcursor в .Net без именованных процедур. Например, выбрав из него? - person Gunnar Steinn; 21.05.2012
comment
@GunnarSteinn - Нет. sys_refcursor - это конструкция PL/SQL, а не конструкция SQL. Его можно объявить только в блоке PL/SQL. И он может быть возвращен вызывающей стороне только в том случае, если блок PL/SQL возвращает что-то, что возможно только с именованными блоками PL/SQL, которые могут объявлять параметры и возвращать значения. Конечно, вы могли бы сконструировать любой SQL-оператор в блоке PL/SQL вашего .Net-приложения и просто выполнить этот SQL-оператор из .Net, полностью исключив потребность в PL/SQL. - person Justin Cave; 21.05.2012