我想对不同的方案运行查询以获取数据并将其导出。我使用以下代码
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>