Вывод из процедуры результатов через 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
→ Ссылка