0

我的应用程序使用 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 语句时,我得到了一个错误。它没有看到函数的文本被引用。

dong this 的正确方法是什么?我是否应该将存储过程放在此 DO 块之外并使用 CREATE OR REPLACE 语句来声明它?或者有没有办法可以将代码保持在条件内?

托尼

4

1 回答 1

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。美元引用的字符串常量

于 2012-03-17T21:59:20.133 回答