如何使我的数据库架构更新脚本在PostgreSql 9.1中工作?

时间:2012-03-17 21:02:30

标签: postgresql postgresql-9.1

我的应用程序使用PostgreSQL 9.1数据库。我们正处于测试阶段,我们偶尔会在PostgreSQL架构中发现错误。我们已经编写了一个安装程序并且正在工作,但现在我们正处于那里,当我们下一个版本时,需要更新安装。

我在这里发布了一个问题,询问如何让我的脚本做出决定。我接下来的答案是使用DO语句。这很有效,但我遇到了一个问题。

我们在数据库中添加了一个表,用于跟踪已安装的最新版本。我的脚本看起来像这样:

DO $$$
BEGIN
    IF NOT EXISTS ( SELECT * FROM "CarSystem"."CarSystem_Versions" WHERE "VersionId" = 2 ) THEN

        -- Schema update statements go here

    END IF;
END;
$$$ LANGUAGE plpgSQL;

大多数语句都是简单的语句,如CREATE或DROP语句。但是,我在下一个版本中要做的一件事就是将代码更改应用于存储的函数。该函数也是用plpgSQL编写的。我在上面的代码中使用了三(3)$$$个符号,因为这个存储过程使用两个(2)$$符号,因为我认为这会使嵌套的plpgSQL看起来不同而不会使第二组美元符号终止第一个

但是当PostgreSQL在我的存储过程中遇到DECLARE语句时,我收到了一个错误。它没有看到函数的文本被引用。

这是什么?我是否应该将存储过程放在此DO块之外并使用CREATE OR REPLACE statemnt来声明它?或者有没有办法让代码保持在条件之内?

1 个答案:

答案 0 :(得分:2)

尝试:

DO $outer$
BEGIN
    IF NOT EXISTS ( SELECT * FROM "CarSystem"."CarSystem_Versions" WHERE "VersionId" = 2 ) THEN

        -- Schema update statements go here

    END IF;
END;
$outer$ LANGUAGE plpgSQL;

4.1.2.4. Dollar-quoted String Constants