我想对不同的方案运行查询以获取数据并将其导出。我使用以下代码
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是不同方案的名称
我看不到任何输出。我该怎么办?
答案 0 :(得分:5)
您编写的代码无法正常工作,因为您必须将结果返回到某物;它是PL / SQL,并且需要INTO子句。当您选择返回两个值(列)和多行时,这不能是标量变量;例如,您可以选择ref游标或集合。
下面是显示一个选项的示例。
我将使用两种模式:SCOTT(当前模式)和HR。两者都将有DEPT表。
正如Scott所拥有的那样,我将在HR模式中创建一个,并授予对Scott的访问权限(否则,Scott甚至都不会看到它,并且过程(即 function )将失败) :
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,创建一个表(其中包含我将从中选择的架构名称)和一个函数。我选择返回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>