2011-08-23 52 views
3

在PostgreSQL,我有隻需要調用dctUpdate功能沒有做一個整體的SQL語句的表的更新規則,因爲SQL語句在實際進行功能。我知道調用函數的唯一方法是通過SELECT dctUpdate(windowId)PSQL:沉默函數調用的輸出,或稱它沒有SELECT

create or replace function infoUpdate(windowId in numeric) returns void as $$ 
begin 
    if windowId is null then 
     update info_timestamp set timestamp = now(); 
    else 
     update info_timestamp set timestamp = now() where window_id = windowId; 
    end if; 
end; 
$$ LANGUAGE plpgsql; 


create or replace rule info_update_rule as on update to some_table do also select infoUpdate(NEW.window_id); 

然而,在命令行中,當規則被觸發,因爲我在some_table更新一排,我從一個調用SELECT條款無用輸出功能:

db=# update some_table set name = 'foobar' where window_id = 1; 
infoupdate 
----------- 

(1 row) 

UPDATE 1 

有沒有辦法有info_update_rule調用infoUpdate功能,沒有它顯示虛輸出?

+0

你真的要設置** **所有在整個表中的時間戳'NOW()'如果只是新的'window_id'是NULL?你需要支持哪些版本的PostgreSQL? –

+0

@mu:是的,我的意思是設置NULL時的所有時間戳,並且我支持PostgreSQL 9.0和更高 – Fred

回答

1

我發現沒有選項來實現這一點使用規則,但實現這個usign觸發器的另一種方式。

所以,你定義觸發功能如下:

CREATE OR REPLACE FUNCTION ur_wrapper_trg() 
    RETURNS trigger AS 
$BODY$ 
begin 
    perform infoUpdate(NEW.window_id); 
    RETURN NEW; 
end; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 
ALTER FUNCTION ur_wrapper_trg() OWNER TO postgres; 

注意PERFORM語法。該語法與SELECT語法相同,除了它抑制所有輸出。

超過了定義觸發

CREATE TRIGGER some_table_utrg 
    BEFORE UPDATE 
    ON some_table 
    FOR EACH ROW 
    EXECUTE PROCEDURE ur_wrapper_trg(); 

最後,你remve您的規則。

未用null進行測試,但實際的windos_id按預期工作,沒有任何不需要的輸出。

諮詢與TriggersRules vs triggers爲詳細的說明。

+0

由於性能原因,我無法使用觸發器。這條規則適用於更新任務關鍵型系統上數千行的查詢,並且爲每一行調用觸發器將會非常昂貴,這就是爲什麼我必須使用規則來執行此操作。我仍然希望獲得垃圾輸出以獲得更好的性能。 – Fred

0

解決方案,這是我的家鄉是select function()前和後馬上打電話給\t \a的關閉。唯一剩下的就是每個呼叫的新行。