Как выполнить запрос по разным схемам одновременно - PullRequest
1 голос
/ 20 апреля 2019

Я хочу выполнить запрос по разным схемам, чтобы получить данные и экспортировать их.Я использую следующий код

DECLARE
  sql_statment VARCHAR2(2000);
BEGIN
  FOR c IN (SELECT brchcode FROM brchs) LOOP
    sql_statment := 'select distinct ''' || c.brchcode ||''', t.risuid from ' || c.brchcode ||
                    '.reg_individualacnt_detail t
                      where t.historytypecode = 60';

    EXECUTE IMMEDIATE sql_statment;
  END LOOP;
END;

, где brchcode - это название различных схем

Я не вижу никакого вывода.что я могу сделать?

1 Ответ

5 голосов
/ 20 апреля 2019

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