Как вернуть строки из блока объявлений / начала / конца в Oracle? - PullRequest
15 голосов
/ 30 июля 2010

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

Код выглядит примерно так:

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

Ответы [ 2 ]

11 голосов
/ 30 июля 2010

Анонимный 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;
/
0 голосов
/ 30 июля 2010

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

Вы можете вернуть любой 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...