2015-04-07 93 views
-1

我有2個表:PostgreSQL函數更新

  1. 第一與日期的日曆,以及開放日(布爾)

  2. 二是假期表。

我做了變革的功能開放日的狀態上的日曆:

CREATE OR REPLACE FUNCTION add_hol() 
RETURNS boolean AS 
UPDATE calendar SET open_day = 'false' 
WHERE day IN (
SELECT jour FROM calendar AS c 
INNER JOIN calendar_hol AS h 
ON c.day=h.day_hol) 
LANGUAGE sql 

但始終錯誤消息:

語法錯誤或接近「UPDATE 」。

如何更正此問題? (我嘗試了很多方法,但沒有結果...)

回答

0

您需要引用函數體。您可以使用正常的'引用並在函數體內將所有'加倍,也可以使用PostgreSQL擴展$$引用。

更新:另外,因爲它沒有返回結果,所以應該聲明爲RETURNS void

CREATE OR REPLACE FUNCTION add_hol() 
RETURNS void AS 
$$ 
UPDATE calendar SET open_day = 'false' 
WHERE day IN (
SELECT jour FROM calendar AS c 
INNER JOIN calendar_hol AS h 
ON c.day=h.day_hol) 
$$ 
LANGUAGE sql; 

有關詳細信息,請參閱手冊。


更新,因爲你正在尋找一個觸發器程序,但沒有這樣說。

這沒有任何意義上的觸發。我想你是實際上是試圖修改插入或更新的行。爲此,您必須在NEW變量中設置值。

胡亂猜測,但這樣的事情可能是你在找什麼:

CREATE OR REPLACE FUNCTION add_hol() 
RETURNS trigger AS 
$$ 
BEGIN 
    IF tg_op = 'INSERT' OR tg_op = 'UPDATE' 
    THEN 

    NEW.open_day = NOT EXISTS (
     SELECT 1 
     FROM calendar_hol AS h 
     WHERE h.day_hol = NEW.day 
    ); 

    RETURN NEW; 

    END IF; 
END; 
$$ 
LANGUAGE plpgsql; 

這是一個基於信息缺失胡亂猜測。這可能是完全錯誤的。如果您仍然在閱讀手冊鏈接在評論中,請發佈新問題正確解釋您正試圖解決您的問題

+0

我已經這樣做了,但後來我得到錯誤:聲明返回布爾值的函數返回類型不匹配。如果我嘗試RETURNS觸發器,有同樣的問題... – Cipango

+0

@Cipango它不會返回任何東西,所以'RETURNS void'。請參閱用戶手冊。 http://www.postgresql.org/docs/current/static/sql-createfunction.html –

+0

是的,謝謝,但後來有錯誤:函數add_hol必須返回類型「觸發器」... – Cipango