2017-12-04 12 views
1

トリガーに問題があります。私はトリガーと関数を作成しました は、同じテーブル内のフィールドをINSERTの更新を実行します。 は戻っている:Postgresql関数がトリガーを返す

Error: function "loss_func" in FROM has return type trigger that is not supported LINE 1: SELECT * FROM table.loss_func()

機能

CREATE OR REPLACE FUNCTION loss_func() 
    RETURNS trigger AS $loss_func$ 
    BEGIN 
    NEW.dt_creation := to_char(now(), 'YYYY-MM-DD'); 

    RETURN NULL; 
    END; 
    $loss_func$ LANGUAGE plpgsql VOLATILE 
    COST 100; 
ALTER FUNCTION loss_func() 
    OWNER TO postgres; 

トリガー

CREATE TRIGGER tgr_loss 
    AFTER INSERT ON loss 
    FOR EACH ROW 
    EXECUTE PROCEDURE loss_func(); 

を私が間違って何をしているのですか?

+0

'SELECT * FROM table.loss_func()'なぜあなたはこれをやっていますか?あなたはこれで何を選択しようとしていますか?これがエラーの原因です。それを削除すると、トリガーを作成しようとします。実行は最初の行で停止しました –

+1

なぜあなたは 'varchar'として日付を格納していますか? –

+0

'AFTER'トリガはNULLを返すことができません。 (値も変更できません) – Jasen

答えて

0

コードの有効バージョンです。 - 今BEFORE挿入を発射し、dt_creationの値を更新し、レコードのNEWバージョンを返すトリガー:私は、トリガーの使用を避けるために提案することができます別の解決策は、のためにデフォルト値を使用することです

drop table loss; 

create table loss (
id int , 
dt_created varchar); 

CREATE OR REPLACE FUNCTION loss_func() 
    RETURNS trigger AS $loss_func$ 
    BEGIN 
    NEW.dt_created := to_char(now(), 'YYYY-MM-DD'); 
    RETURN NEW; 
    END; 
    $loss_func$ LANGUAGE plpgsql VOLATILE 
    COST 100; 

ALTER FUNCTION loss_func() 
    OWNER TO postgres; 

CREATE TRIGGER tgr_loss 
    BEFORE INSERT ON loss 
    FOR EACH ROW 
    EXECUTE PROCEDURE loss_func(); 

insert into loss(id) values(1); 

dt_creation時にテーブルを作成する(とvarcharとして日付を格納するのではなく、タイムスタンプを使用してください):

... 
dt_creation timestamp default now(), 
... 

か、now()にデフォルト値を設定するために、あなたのテーブルを変更することができます

alter table loss 
alter column dt_creation set default now(); 
関連する問題