【问题标题】:How to execute 'Select' query on all Tables within a schema on Oracle如何对 Oracle 架构内的所有表执行“选择”查询
【发布时间】:2018-08-16 13:42:41
【问题描述】:

我有一个包含 1000 多个表的架构,我需要运行“选择”查询,即

SELECT * FROM Table_Name

在模式的每个表上,这是否可能? 如果是,那么如何?

【问题讨论】:

  • 您希望从何处以及如何获取数据?

标签: java database oracle


【解决方案1】:

当然可以。您将编写 1,000 多个语句,然后运行它们。或者,也许您编写了一个为您动态生成 SQL 的脚本,然后您运行它。

但我什至可以想象你为什么要这样做的原因只有一个,那就是从数据库中导出整个架构,并将该数据移动到其他地方。

如果这就是您想要做的,那么有很多更好的方法来做这件事 (Data Pump)。

您提出的建议将非常缓慢,并且会压倒您正在使用的任何客户端/程序/显示器。

用一些“为什么”或业务需求更新您的问题,我们可以为您提供更好的答案。

【讨论】:

  • 我很欣赏这种讽刺,但关键是要获得结果并将其与目标端进行比较,因为我们正在迁移我们的数据,并且需要确保数据在迁移时没有损坏或不正确。
  • 这不是讽刺,你真的不应该做你要求做的事。如果您想比较两个来源之间的数据完整性,这不是一个好方法。
  • @Taimoor 请用您的迁移详细信息以及您希望如何确保数据完整性更新您的问题 - 您如何进行导出/迁移可能决定您是否/如何/何时担心数据。
  • 这就是我所问的是否有可能,有没有什么办法,比如'for'循环,当我关心的只是数据完整性时,我不需要提及我的迁移细节。我问的是一个简单的问题,我们可以对模式中的所有表运行选择查询,请不要开始编写 1000 多个选择语句。
  • 但是,您的问题并不简单,您希望如何处理查询结果?将它们打印到一张纸上并查看它们?是的,您可以使用“循环”来查询表名列表并通过它们运行 select * froms,但这不是您的实际问题。你的问题之所以被否决是有原因的——尽管不是我做的。
【解决方案2】:

显然你做错了。我和其他人一样,看不出这样做的正当理由,但是——正如你所说——你问了一个问题并需要一个答案。因此,这是一种选择:它基于 Scott 的模式,其中包含多个表。

  • 我正在清理回收站以清除垃圾
  • 从 TAB 中选择显示我希望获得哪些表作为输出
  • PL/SQL 在循环中创建一组 begin spool 到 TXT 文件 - 选择语句本身 - 结束 spooling SQL*Plus 命令
  • 应将 DBMS_OUTPUT 结果复制/粘贴到 SQL*Plus 中并执行
  • 最终结果是包含数据的TXT文件列表
  • 我正在设置 LINESIZE 和 PAGESIZE 以使输出看起来比平时更漂亮;您可能想要设置一些其他参数。查看 SQL*Plus 文档了解更多信息

好的,给你:

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>

现在,您可以尽情使用它们了。

【讨论】:

    猜你喜欢
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多