【问题标题】:How to integrate many SQL query results into one output (Oracle)如何将多个 SQL 查询结果集成到一个输出中(Oracle)
【发布时间】:2009-06-04 08:08:49
【问题描述】:

我的服务器采用以下系统:

Windows 2003 R2 Ent 版 SP 2 甲骨文 1.0.2.0.4.0 数据库:5

数据库的归档日志位于闪回恢复区,如 v$recovery_file_dest 的 NAME 列所示,也可以从 sqlplus 调用“show parameter db_recovery_file_dest”。我想使用 SQL 或 PLSQL 脚本监控每个数据库归档日志的空间使用情况。

如果我在下面调用查询:

SET LINESIZE 145
SET PAGESIZE 9999

COLUMN name               FORMAT a30                  HEADING 'Name'
COLUMN space_limit        FORMAT 99,999,999,999,999   HEADING 'Space Limit'
COLUMN space_used         FORMAT 99,999,999,999,999   HEADING 'Space Used'
COLUMN space_used_pct     FORMAT 999.99               HEADING '% Used'
COLUMN space_reclaimable  FORMAT 99,999,999,999,999   HEADING 'Space Reclaimable'
COLUMN pct_reclaimable    FORMAT 999.99               HEADING '% Reclaimable'
COLUMN number_of_files    FORMAT 999,999              HEADING 'Number of Files'


prompt 
prompt Current location, disk quota, space in use, space reclaimable by deleting files,
prompt and number of files in the Flash Recovery Area.
prompt 

SELECT
    name
  , space_limit
  , space_used
  , ROUND((space_used / space_limit)*100, 2) space_used_pct
  , space_reclaimable
  , ROUND((space_reclaimable / space_limit)*100, 2) pct_reclaimable
  , number_of_files
FROM
    v$recovery_file_dest
ORDER BY
    name
/

我会得到这样的输出:

Name                                   Space Limit          Space Used  % Used   Space Reclaimable % Reclaimable Number of Files                 
------------------------------ ------------------- ------------------- ------- ------------------- ------------- ---------------                 
D:\oracle\product\10.2.0\flash     107,374,182,400      34,239,603,712   31.89                   0           .00             804                 
_recovery_area\DBNAME   

我的问题是:如何将每个数据库中每个相似查询的结果整合到一个输出中?

输出如下所示:

    Name                                   Space Limit          Space Used  % Used   Space Reclaimable % Reclaimable Number of Files                 
    ------------------------------ ------------------- ------------------- ------- ------------------- ------------- ---------------                 
  D:\oracle\product\10.2.0\flash     107,374,182,400      34,239,603,712   31.89                   0           .00             804                 
_recovery_area\DBNAME1   

D:\oracle\product\10.2.0\flash     107,374,182,400      34,239,603,712   31.89                   0           .00             804                 
    _recovery_area\DBNAME2

D:\oracle\product\10.2.0\flash     107,374,182,400      34,239,603,712   31.89                   0           .00             804                 
    _recovery_area\DBNAME3

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    我假设您希望所有数据库结果都在一个结果集中,而不是依次连接到每个结果并将输出假脱机到同一个文件。您必须选择其中一个数据库并创建到其他四个的数据库链接(在每个数据库中选择或创建一个连接用户,该用户对 V$RECOVERY_FILE_DEST 具有 SELECT 权限。

    那么你的查询就变成了

    select ...
     from v$recover_file_dest
    union all
    select ...
    from v$recover_file_dest@db2
    union all
    select ...
    from v$recover_file_dest@db3
    union all
    select ...
    from v$recover_file_dest@db4
    

    【讨论】:

      【解决方案2】:

      使用 UNION 将不同查询的结果合并到一个集合中。例如:

      select name, space_limit, etc...
      from v$recovery_file_dest
      UNION
      select name, space_limit, etc...
      from v$recovery_file_dest  -- presumably a different value than the first one
      

      应该没问题,因为每个查询以相同的顺序返回相同的一组列。

      【讨论】:

      • 这与 SQL Server 相关,而不是 Oracle,所以它可能不一样——但它可能是:如果您知道您的行已经不同,请改用 UNION ALL。一个简单的 UNION 要求 DBMS 花费额外的时间去除重复的行。
      • @RolandTumble - 好点;我相信它适用于两个平台。
      • 抱歉评论延迟。我们取消了执行此脚本,因为我们的 Oracle Grid Control 正常工作。
      猜你喜欢
      • 2014-07-07
      • 2016-05-29
      • 2019-07-14
      • 2018-04-23
      • 1970-01-01
      • 2020-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多