PL/SQL 迭代所有模式并在所有模式上运行相同的查询

Posted

技术标签:

【中文标题】PL/SQL 迭代所有模式并在所有模式上运行相同的查询【英文标题】:PL/SQL iterate all schemas and run the same query on all of them 【发布时间】:2012-08-22 19:14:20 【问题描述】:

我有各种 Oracle 数据库,例如 ONE.db TWO.db THIRD.db 等,我想运行在 ONE.db 上成功运行的 SELECT,例如 SELECT * FROM CUSTOMERS 等,然后获取每个数据库的结果.如何使用 PL/SQL 做到这一点? (没有数据库链接或工具等)

【问题讨论】:

您不能在 Oracle 中跨数据库进行查询,您总是需要(重新)连接以将查询发送到不同的数据库,因此这在单个 PL/SQL 程序中是不可能的.或者您实际上是在谈论模式(即用户) 没有数据库链接这是不可能的...你确定你的条件吗? "ONE.db TWO.db THIRD.db" 似乎暗示了模式而不是数据库。 您应该阅读一些有关 Oracle schema 和 instance 的信息。只是为了消除一些混淆。祝阅读愉快! 【参考方案1】:

假设您谈论的是模式,而不是单独的数据库实例,并且假设所有 CUSTOMERS 表的结构完全相同(包括列顺序),您可以以对所有表具有 SELECT 访问权限的用户身份登录,那么:

SELECT 'ONE' owner, c.* FROM one.customers c
UNION ALL
SELECT 'TWO' owner, c.* FROM two.customers c
UNION ALL
SELECT 'THIRD' owner, c.* FROM third.customers c
;

是否需要第一列“所有者”取决于您。

如果你想在运行时用 PL/SQL 生成上述语句,你可以这样做:

DECLARE
  qry VARCHAR2(32767);
  rc sys_refcursor;
BEGIN
  FOR r IN (SELECT owner, table_name
            FROM all_tables
            WHERE table_name = 'CUSTOMERS') LOOP
    IF qry IS NOT NULL THEN
      qry := qry || ' UNION ALL ';
    END IF;
    qry := qry || 'SELECT '''
               || r.owner
               || ''' owner, c.* FROM '
               || r.owner
               || '.customers c';
  END LOOP;
  OPEN rc FOR qry;
  -- fetch from the ref cursor and do whatever you want with the records
END;

【讨论】:

以上是关于PL/SQL 迭代所有模式并在所有模式上运行相同的查询的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 pl/sql 脚本导出 oracle sql 开发人员表模式?

(十三)PL/SQL包

错误:PL SQL 包中不存在表或视图

PL/SQL 加速长函数

获取模式中所有表的计数

设计模式之迭代器模式