Я хочу возвратить строки из избранного оператора в объявить/начать/закончить блоке. Я могу сделать это в T-SQL, но я хотел бы знать, как выполнить в нем МН / SQL.
Код немного походит на следующее:
declare
blah number := 42;
begin
select *
from x
where x.value = blah;
end;
Анонимный блок 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;
/
Ну, это сильно зависит от вашей библиотеки доступа к данным.
В качестве параметра можно вернуть любой совместимый с 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;