Postgres - 在所有数据库(相同的模式)上运行相同的查询

时间:2017-02-24 19:49:16

标签: sql postgresql navicat

希望这是一个非常直截了当的问题。

我有一个简单的SELECT查询(内置了一些子查询)。我有超过40个数据库,我需要为所有数据库运行此查询(所有数据库都具有相同的模式)并将结果返回到一个大表中。

我正在想象一个循环序列(比如javascript的i = 0; i< 40; i ++),它带有一个定义的变量,一旦它运行所有的DB就会自动停止。

(我在Navicat工作,这可能没关系)

谢谢!

1 个答案:

答案 0 :(得分:0)

如果有人需要更多有关如何进行跨数据库查询的示例,下面的示例将清理每个拥有该数据库的数据库上的databasechangeloglock表:

CREATE EXTENSION IF NOT EXISTS dblink;

DO 
$$
DECLARE database_name TEXT;
DECLARE conn_template TEXT;
DECLARE conn_string TEXT;
DECLARE table_exists Boolean;
BEGIN
    conn_template = 'user=myuser password=mypass dbname=';

    FOR database_name IN
        SELECT datname FROM pg_database
        WHERE datistemplate = false
    LOOP
        conn_string = conn_template || database_name;

        table_exists = (select table_exists_ from dblink(conn_string, '(select Count(*) > 0 from information_schema.tables where table_name = ''databasechangeloglock'')') as (table_exists_ Boolean));
        IF table_exists THEN
            perform dblink_exec(conn_string, 'delete from databasechangeloglock');
        END IF;     
    END LOOP;

END
$$