我的应用程序使用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来声明它?或者有没有办法让代码保持在条件之内?
贝
答案 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;