【发布时间】:2013-10-25 15:07:53
【问题描述】:
我的问题有两个。首先,我必须评估 PostgreSQL 的版本才能运行正确的查询。我有一些运行 PostgreSQL 8.* 的服务器,它们在下面的查询中使用 DO 时遇到问题。我运行 9.* 的服务器(我主要使用 9.2 服务器)给我一个错误“查询没有结果数据的目的地”,而我想要的只是打印出 select 语句。
我的查询:
DO
$BODY$
BEGIN
IF (SELECT setting from pg_settings where name = 'server_version') >= '9.2' THEN
SELECT pg_database.datname AS Database_Name, pg_authid.rolname AS Database_Owner,
pg_authid.rolsuper AS IsSuperUser, pg_tablespace.spcname AS TableSpaceName,
pg_catalog.pg_tablespace_location(pg_tablespace.oid) AS TableSpaceLocation
FROM pg_database
JOIN pg_authid on pg_database.datdba = pg_authid.oid
CROSS JOIN pg_tablespace
WHERE datistemplate = false
AND pg_database.dattablespace = pg_tablespace.oid;
ELSE
SELECT pg_database.datname AS Database_Name, pg_authid.rolname AS Database_Owner,
pg_authid.rolsuper AS IsSuperUser, pg_tablespace.spcname AS TableSpaceName, pg_tablespace.spclocation AS TableSpaceLocation
FROM pg_database
JOIN pg_authid on pg_database.datdba = pg_authid.oid
CROSS JOIN pg_tablespace
WHERE datistemplate = false
AND pg_database.dattablespace = pg_tablespace.oid;
END IF;
END;
$BODY$
所以,如果DO 在 9.0 之前不起作用,而我在 9.0 之后遇到错误,那么我有点难以满足这两个条件。
【问题讨论】:
-
使用 PERFORM 代替 SELECT
-
您可以在提交查询之前在客户端测试服务器版本(从而避免
DO构造),或者在 8.x 服务器上创建自己的pg_tablespace_location函数,其方式如下:相同的查询将适用于所有服务器版本。
标签: sql postgresql plpgsql