在postgresql函数中循环遍历数据库

时间:2012-08-22 15:01:52

标签: function postgresql

我想循环遍历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';

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

有没有办法在postgresql中执行此操作?是否有“数据库”声明类型?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

尝试DECLARE db_name NAME;

答案 2 :(得分:0)

我无法使用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