манипулировать датой перед возвратом в качестве REF CURSOR в .NET - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть процедура plsql, вызываемая из VB.NET через ODAC. Процедура делает простой выбор:

cursor C_emp is select name, surname from employees;

Процедура должна иметь параметр OUT в качестве REF CURSOR.

Я знаю, что могу сделать простое:

declare
  L_cursor sys_refcursor;
begin
  open L_cursor for select name, surname from employees;
  ...
end;

Но мне нужно добавить пару столбцов в OUT REF CURSOR, основываясь на некоторой логике из оператора select.

Я думал о создании цикла и обработке одной записи за раз в таблицу типа массив, а затем преобразовал ее в REF CURSOR.

Как я могу это сделать? Любое предложение высоко ценится, большое спасибо заранее.

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

Я почти уверен, что эти вычисления можно выполнить внутри одного оператора select без необходимости создавать дополнительный курсор. Но, если вы все еще хотите этого, я покажу вам один возможный пример, как этого добиться.

Сначала вы должны объявить объект TYPE. (Это будет представлять строку в результате запроса):

create or replace type MY_TYPE as object (
    name varchar2(64),
    surname varchar2(64),
    calculatedValue varchar2(64) --your calculated column. You may add as many columns as needed, but for simplicity, I'll stick to only one column
);

Теперь создайте вложенную таблицу из MY_TYPE объектов (она будет представлять весь набор результатов):

create or replace type MY_TYPE_LIST as table of MY_TYPE;

Теперь вы готовы написать конвейерную функцию для возврата нужного набора результатов.

create or replace function MY_FUNC return MY_TYPE_LIST pipelined as
cursor cur is
    select name, surname from employees;
name varchar2(64);
surname varchar2(64);
calculatedColumn varchar2(64);
begin
  open cur;

  loop
    fetch cur into name, surname;
    exit when cur%notfound;

    --do something here, calculate new columns
    calculatedColumn := ...; --assign a value you want
    pipe row (MY_TYPE(name, surname, calculatedColumn)); --the moment of truth. Pipe a row containing the new column

  end loop;
end;

Эта функция вернет новый курсор, содержащий значения объекта MY_TYPE.

0 голосов
/ 11 апреля 2019

Так же, как вы используете любую логику в операторе выбора.

declare
  L_cursor sys_refcursor;
begin
 OPEN l_cursor FOR SELECT name,
     CASE
          WHEN name LIKE 'Jack%' THEN 'Jack the Ripper'
     END AS nick_name,
     surname FROM employees;

...
end;
...