PostgreSQL按服务器版本有条件地执行语句

时间:2011-09-02 10:59:25

标签: postgresql

我目前正在编写一些安装程序脚本,根据系统的配置针对不同的数据库类型触发SQL文件(webapplication支持多个数据库服务器,如MySQL,MSSQL和PostgreSQL)。

其中一种类型是PostgreSQL。我不熟悉它,我想知道是否可以在一个定义/填充SQL文件中发表声明,使得SQL查询以特定的PostgreSQL服务器版本为条件。

如何在普通PGSQL中有条件地生成SQL语句,以便它只在版本9中执行?命令是:

ALTER DATABASE dbname SET bytea_output='escape';

版本检查是将版本与9进行比较。

3 个答案:

答案 0 :(得分:4)

或者你可以使用

select setting from pg_settings where name = 'server_version'

或者

select setting from pg_settings where name = 'server_version_num'

如果您只需要主要版本

select Substr(setting, 1, 1) from pg_settings where name = 'server_version_num'

select Substr(setting, 1, strpos(setting, '.')-1) from pg_settings where name = 'server_version'

如果您希望它与两位数版本兼容。

答案 1 :(得分:2)

Postgres确实有version()功能,但没有major_vesion()。假设输出字符串始终包含版本号number(s).number(s).number(s),您可以将自己的包装器编写为:

CREATE OR REPLACE FUNCTION major_version() RETURNS smallint
AS $BODY$ 
    SELECT substring(version() from $$(\d+)\.\d+\.\d+$$)::smallint;
$BODY$ LANGUAGE SQL;

示例:

=> Select major_version();
 major_version
---------------
             9
(1 row)

然而,真正的问题是AFAIK你can't在“纯”SQL中有条件地执行你的命令,你最能做的就是编写一些这样的存储函数:

CREATE OR REPLACE FUNCTION conditionalInvoke() RETURNS void
AS $BODY$
BEGIN
    IF major_version() = 9 THEN
        ALTER DATABASE postgres SET bytea_output='escape';
    END IF;
    RETURN;
END;
$BODY$ LANGUAGE plpgsql;

我认为您应该使用某种脚本语言并使用它生成适当的SQL。

答案 2 :(得分:0)

也许你可以依赖于输出 select version(); (可能你需要修剪和子串一点)

BTW(某些)DDL语句可能不会从函数内发出;也许你将不得不逃避shell编程和here-documents。