Вывод из процедуры результатов через OUT параметр
Необходимо реализовать вывод из процедуры через параметр OUT не используя буфера обмена, то есть dbms_output.put_line.
Процедура находится в пакете.
PROCEDURE array_app
(street IN Streets.TITLE%TYPE,
dom IN APARTMENTS.HOUSE%TYPE,
res OUT Varchar2)
IS
CURSOR my_cur IS SELECT DISTINCT idapart FROM POSSESSION;
CURSOR cur1 (street IN VARCHAR2, dom IN INTEGER)
IS
SELECT APARTMENTS.id, num FROM APARTMENTS, Streets
WHERE HOUSE = dom AND TITLE = street AND APARTMENTS.IDSTREET = Streets.ID;
kv INTEGER;
cnumber number;
str Varchar2(100);
BEGIN
res := '';
OPEN cur1 (street, dom);
FETCH cur1 INTO cnumber, kv;
FOR f IN my_cur LOOP
IF f.idapart = cnumber THEN
str := res;
select str || ', ' || kv INTO res from dual;
RETURN;
END IF;
END LOOP;
CLOSE cur1;
END;
И вызов процедуры
DECLARE
res1 Varchar2(100);
BEGIN
pack.array_app('Татищева', 75, res1);
END;
Пример данных: Это таблица помещений, где соответственно столбцы код, улица и номер дома и номер квартиры:
CREATE TABLE Apartments (id INTEGER PRIMARY KEY, idstreet VARCHAR2(100), house INTEGER NOT NULL, num INTEGER);
INSERT INTO Apartments (id, idstreet, house, num) VALUES (1, 'Татищева', 75, 5);
INSERT INTO Apartments (id, idstreet, house, num) VALUES (2, 'Кирова', 3, 15);
INSERT INTO Apartments (id, idstreet, house, num) VALUES (3, 'Новая', 28, 34);
INSERT INTO Apartments (id, idstreet, house, num) VALUES (4, 'Татищева', 75, 150);
Также имеется таблица владения, в которой содержится как раз код объекта владения:
CREATE TABLE Possession (id INTEGER PRIMARY KEY, idapart INTEGER NOT NULL REFERENCES Apartments);
INSERT INTO Possession (id, idapart) VALUES (1, 1);
INSERT INTO Possession (id, idapart) VALUES (2, 4);
Соответственно, в результате выбирается запись с кодом 1 и возвращается номер квартиры. Если в наборе входных данных будет несколько элементов входящих в обе таблицы с данными, то вернуться должны все соответствующие номера квартир.
Ответы (1 шт):
Автор решения: 0xdb
→ Ссылка
Можно например вот так:
create or replace package pack1 as
procedure array_app (street varchar2, house integer, cur1 out sys_refcursor);
end;
/
create or replace package body pack1 as
procedure array_app (street varchar2, house integer, cur1 out sys_refcursor) is
begin
open cur1 for
select a.num
from apartments a
where a.house = array_app.house
and a.idstreet = array_app.street
and exists (
select 1
from possession p
where p.idapart = a.id
);
end array_app;
end pack1;
/
Запуск и результат:
var cur1 refcursor
exec pack1.array_app('Татищева', 75, :cur1)
print cur1
NUM
----------
150
5