Как возвратить строки из объявить/начать/закончить блока в Oracle?

Я хочу возвратить строки из избранного оператора в объявить/начать/закончить блоке. Я могу сделать это в T-SQL, но я хотел бы знать, как выполнить в нем МН / SQL.

Код немного походит на следующее:

declare
     blah number := 42;
begin
     select *
     from x
     where x.value = blah;
end;
15
задан Jeffrey Kemp 30 July 2010 в 13:59
поделиться

2 ответа

Анонимный блок PL/SQL, подобный тому, который вы показали, не может ничего "вернуть". Однако он может взаимодействовать с вызывающей стороной посредством связывания переменных.

Поэтому метод, который я бы использовал в этом случае, заключается в объявлении ссылки на курсор, открытии его в блоке PL/SQL для нужного запроса, и пусть вызывающее приложение получает строки из него. В SQLPlus это будет выглядеть так:

variable rc refcursor

declare
     blah number := 42;
begin
  open :rc for
     select *
     from x
     where x.value = blah;
end;
/

print x

Если переделать PL/SQL как хранимую функцию, то она может возвращать значения. В этом случае можно создать тип коллекции, собрать все строки в переменную этого типа и вернуть ее:

CREATE TYPE number_table AS TABLE OF NUMBER;

CREATE FUNCTION get_blah_from_x (blah  INTEGER)
  RETURN number_table
  IS
    values  number_table;
  BEGIN
    SELECT id
      BULK COLLECT INTO values
      FROM x
      WHERE x.value = blah;
    RETURN values;
  END;
/
11
ответ дан 1 December 2019 в 04:52
поделиться

Ну, это сильно зависит от вашей библиотеки доступа к данным.

В качестве параметра можно вернуть любой совместимый с SQL тип. Сюда входят сложные типы SQL и типы коллекций. Но большинство библиотек просто не способны обрабатывать типы объектов Oracle.

В любом случае, в моих примерах будут использоваться следующие типы объектов:

create type SomeType as object(Field1 VarChar(50));

create type SomeTypeList as table of SomeType;

Когда ваша библиотека доступа может обрабатывать типы объектов, вы можете просто вернуть список объектов PL / SQL:

begin
  :list := SomeTypeList(SomeType('a'),SomeType('b'),SomeType('c'));
end;

Если нет, вы можете обойти это с помощью принудительный выбор этого списка и возврат его результата в виде курсора:

declare
  list SomeTypeList;
begin
  list := SomeTypeList(SomeType('a'),SomeType('b'),SomeType('c'));
  open :yourCursor for
    SELECT A
    FROM   table(list);
end;
0
ответ дан 1 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: