2

我想遍历 postgresql 数据库列表并从 postgresql 函数中对它们运行一些查询。这是一个代码示例...

    CREATE OR REPLACE FUNCTION my_function() 
    RETURNS VOID AS  
    $$
    DECLARE
        db VARCHAR(50); -- this declaration is where the confusion is
    BEGIN
        FOR db IN 
            SELECT datname FROM pg_catalog.pg_database WHERE datname ~ '^mydbname_'
        LOOP
            -- this is just an example
            SELECT * FROM db;
        END LOOP;
    END; 
    $$
    LANGUAGE 'plpgsql';

我知道我可以使用 postgresqlEXECUTE将查询评估为字符串(例如,EXECUTE 'SELECT * FROM ' || db || ';';),但我的查询相当长且复杂。

有没有办法在 postgresql 中做到这一点?是否有“数据库”声明类型?

4

3 回答 3

2

您不能直接在查询中将变量用作对象名称(数据库、表、列)。您必须使用 EXECUTE。

这无论如何都行不通,因为您不能进行跨数据库查询。从客户端执行此操作或查看使用 dblink。有一个 SQL/MED(外国数据包装器)的实现,但奇怪的是我认为还没有PostgreSQL 包装器

于 2012-08-22T15:32:22.353 回答
1

pg_database 中的数据库名称不是名称类型吗?

尝试DECLARE db_name NAME;

于 2012-08-22T15:08:58.800 回答
1

我无法使用 Postgresql 函数来做到这一点。如果有帮助,这里有一个非常简单的 bash 脚本来遍历所有数据库:

#!/bin/bash
 
all="SELECT datname FROM pg_database WHERE datistemplate = false and datname != 'postgres'"
psql -h host -U user postgres --no-align -t -c "${all}" | while read -a bd ; do
    echo "Processing ${bd}..."
    psql -h host -U user "${bd}" -c "SELECT current_database()"
    # psql -h host -U user "${bd}" -f fix.sql 
done
于 2020-07-12T22:55:43.303 回答