我想循环遍历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中执行此操作?是否有“数据库”声明类型?
答案 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