如何一次对不同的方案运行查询



我想对不同的方案运行查询以获取数据并将其导出。我使用以下代码

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 是不同方案的名称

看不到任何输出。我能做什么?

你写的代码不能工作,因为你必须把结果返回到一些东西;它是PL/SQL,需要一个INTO子句。由于选择返回两个值(列(和多行,因此不能是标量变量;例如,您可以选择 ref 光标或集合。

下面是一个显示一个选项的示例。

我将使用两种模式:SCOTT(当前模式(和 HR。两者都将拥有 DEPT 表。

由于 Scott 已经拥有它,我将在 HR 模式中创建一个并授予对 Scott 的访问权限(否则,Scott 甚至不会看到它,并且过程(即函数(将失败(:

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.

回到 Scott,创建一个表(其中包含我将从中选择的模式名称(和一个函数。我选择返回引用光标;如果你愿意,你可以退回其他东西。

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>

最新更新