【发布时间】:2018-08-16 13:42:41
【问题描述】:
我有一个包含 1000 多个表的架构,我需要运行“选择”查询,即
SELECT * FROM Table_Name
在模式的每个表上,这是否可能? 如果是,那么如何?
【问题讨论】:
-
您希望从何处以及如何获取数据?
我有一个包含 1000 多个表的架构,我需要运行“选择”查询,即
SELECT * FROM Table_Name
在模式的每个表上,这是否可能? 如果是,那么如何?
【问题讨论】:
当然可以。您将编写 1,000 多个语句,然后运行它们。或者,也许您编写了一个为您动态生成 SQL 的脚本,然后您运行它。
但我什至可以想象你为什么要这样做的原因只有一个,那就是从数据库中导出整个架构,并将该数据移动到其他地方。
如果这就是您想要做的,那么有很多更好的方法来做这件事 (Data Pump)。
您提出的建议将非常缓慢,并且会压倒您正在使用的任何客户端/程序/显示器。
用一些“为什么”或业务需求更新您的问题,我们可以为您提供更好的答案。
【讨论】:
显然你做错了。我和其他人一样,看不出这样做的正当理由,但是——正如你所说——你问了一个问题并需要一个答案。因此,这是一种选择:它基于 Scott 的模式,其中包含多个表。
好的,给你:
SQL> purge recyclebin;
Recyclebin purged.
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
BONUS TABLE
DEPT TABLE
EMP TABLE
SALGRADE TABLE
SQL> set serveroutput on;
SQL> begin
2 for cur_r in (select tname from tab) loop
3 dbms_output.put_line('spool ' || cur_r.tname ||'.txt');
4 dbms_output.put_line('select * from ' || cur_r.tname ||';');
5 dbms_output.put_line('spool off');
6 end loop;
7 end;
8 /
spool BONUS.txt
select * from BONUS;
spool off
spool DEPT.txt
select * from DEPT;
spool off
spool EMP.txt
select * from EMP;
spool off
spool SALGRADE.txt
select * from SALGRADE;
spool off
PL/SQL procedure successfully completed.
SQL>
现在,运行结果:
SQL> set pagesize 100
SQL> set linesize 100
SQL> spool BONUS.txt
SQL> select * from BONUS;
ENAME JOB SAL COMM
---------- --------- ---------- ----------
KING PRESIDENT 1000 100
SQL> spool off
SQL> spool DEPT.txt
SQL> select * from DEPT;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> spool off
SQL> spool EMP.txt
SQL> select * from EMP;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17.12.80 800 20
7499 ALLEN SALESMAN 7698 20.02.81 1600 300 30
7521 WARD SALESMAN 7698 22.02.81 1250 500 30
7566 JONES MANAGER 7839 02.04.81 2975 20
7654 MARTIN SALESMAN 7698 28.09.81 1250 1400 30
7698 BLAKE MANAGER 7839 01.05.81 2850 30
7782 CLARK MANAGER 7839 09.06.81 2450 10
7839 KING PRESIDENT 17.11.81 5000 10
7844 TURNER SALESMAN 7698 08.09.81 1500 0 30
7900 JAMES CLERK 7698 03.12.81 950 30
7902 FORD ANALYST 7566 03.12.81 3000 20
7934 MILLER CLERK 7782 23.01.82 1300 10
12 rows selected.
SQL> spool off
SQL> spool SALGRADE.txt
SQL> select * from SALGRADE;
GRADE LOSAL HISAL
---------- ---------- ----------
1 700 1200
2 1201 1400
3 1401 2000
4 2001 3000
5 3001 9999
SQL> spool off
SQL>
在当前目录下,现在有几个TXT文件:
SQL> $dir *.txt
Volume in drive C is OSDisk
Volume Serial Number is 7635-F892
Directory of C:\Users\littlefoot
16.08.2018. 21:12 353 BONUS.txt
16.08.2018. 21:12 658 DEPT.txt
16.08.2018. 21:12 1.494 EMP.txt
16.08.2018. 21:12 764 SALGRADE.txt
4 File(s) 3.269 bytes
0 Dir(s) 304.432.480.256 bytes free
SQL>
现在,您可以尽情使用它们了。
【讨论】: