2012-03-17 51 views
0

我的應用程序使用PostgreSQL 9.1數據庫。我們正處於測試階段,我們偶然發現了PostgreSQL架構中的錯誤。我們有一個編寫和運行的安裝程序,但現在我們處於安裝位置,需要在製作下一個版本時進行更新。如何讓我的數據庫模式更新腳本在PostgreSql 9.1中工作?

我在這裏發佈了一個先前的問題,詢問如何讓我的腳本做出決定。我去的答案是使用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語句來聲明它?或者有沒有辦法讓代碼保持在條件之內?

託尼

回答

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

+0

謝謝!我明天將會拍攝這張照片,看看我能否成功。聽起來完全像我所需要的。 – 2012-03-18 02:28:53

+0

這對我有效!再次感謝! – 2012-03-19 14:53:08

相關問題