Код, который вы написали, не может работать, так как вы должны вернуть результат в что-то ;это PL / SQL и требует предложения INTO.Поскольку вы решили вернуть два значения (столбцы) и несколько строк, это не может быть скалярной переменной;Например, вы можете выбрать ссылку курсора или коллекцию.
Вот пример, который показывает одну опцию.
Я буду использовать две схемы: SCOTT (текущая схема) и HR.У обоих будет таблица DEPT.
Поскольку у Скотта она уже есть, я создам ее в схеме HR и предоставлю доступ Скотту (в противном случае Скотт даже не увидит ее и процедуру (т. Е. функция ) потерпит неудачу):
SQL> connect hr/hr
Connected.
SQL> create table dept (deptno number, dname varchar2(10), loc varchar2(10));
Table created.
SQL> insert into dept values (55, 'IT', 'Zagreb');
1 row created.
SQL> grant select on dept to scott;
Grant succeeded.
SQL> commit;
Commit complete.
Вернемся к Скотту, чтобы создать таблицу (в которой будут имена схем, из которых я буду выбирать) и функцию.Я решил вернуть REF CURSOR;Вы можете вернуть что-то еще, если хотите.
SQL> connect scott/tiger
Connected.
SQL> create table brchs (brchcode varchar2(10));
Table created.
SQL> insert into brchs (brchcode)
2 select 'scott' from dual union all
3 select 'hr' from dual;
2 rows created.
SQL> create or replace function f_br
2 return sys_refcursor
3 is
4 l_str varchar2(4000);
5 l_rc sys_refcursor;
6 begin
7 for cur_r in (select brchcode from brchs) loop
8 l_str := l_str ||
9 'union all
10 select ' || chr(39)|| cur_r.brchcode ||chr(39) || ', d.dname
11 from ' || cur_r.brchcode ||'.dept d
12 where d.deptno > 0';
13 end loop;
14
15 l_str := ltrim(l_str, 'union all');
16
17 open l_rc for l_str;
18 return l_rc;
19 end;
20 /
Function created.
SQL>
Наконец, тестирование:
SQL> select f_br from dual;
F_BR
--------------------
CURSOR STATEMENT : 1
CURSOR STATEMENT : 1
'SCOT DNAME
----- --------------
scott ACCOUNTING
scott RESEARCH
scott SALES
scott OPERATIONS
hr IT
SQL>