2017-04-25 14 views
0

でトリガーを作成します。は私が私のトリガーに問題が持っているPostgreSQLの

CREATE OR REPLACE FUNCTION process_fillDerivedFrom_used() RETURNS TRIGGER AS $fillDerivedFrom_used$ 
    DECLARE 
    prog  varchar(255); 
    current varchar(255); 
    BEGIN 
    SELECT u.iduseentity as prog ,g.idCreatedEntity as current 
    FROM entity e 
    JOIN used u ON e.identity=u.iduseentity 
    JOIN activity a ON a.idactivity=u.idusedactivity 
    JOIN generatedby g ON g.idcreatoractivity=a.idactivity 

    INSERT INTO DERIVEDFROM VALUES (prog,current) 
    END; 

$fillDerivedFrom_used$ LANGUAGE plpgsql; 
CREATE TRIGGER fillDerivedFrom_used 
AFTER INSERT OR UPDATE OR DELETE ON emp 
    FOR EACH ROW EXECUTE PROCEDURE process_fillDerivedFrom_used(); 

私は3つのテーブルを使用し、クエリはので、私はエラーがここから来ていないと思いますが正しいです。しかし、ターミナルでこのトリガーをコピーすると何も起こりません。エラーメッセージも端末に書き込むこともできますが、私はトリガーで何かを忘れてしまったので、何も実行できません。

私は学校とpostgresqlで学ぶ2つの言語PL/SQLを混在させると思います。あなたは私はあなたが持っているどのような問題を知らない

+0

あなたは変数にではなく、別名として選択する必要があります...あなたが選択 –

+0

後にセミコロンを欠場し、あなたの定義機能は奇妙に見える - あなたは4つの表はEMPの各行に参加することを照会したいです..? DERIVEDFROM select ... all_your_select ... 'に挿入するのはなぜですか?ここでNEWまたはOLDレコードを操作しないでください - トリガー機能のようには見えません –

答えて

0

を助けるため

ありがとうございました。一つは明らかです。 asは変数には使用されません。 intoです。もちろん

CREATE OR REPLACE FUNCTION process_fillDerivedFrom_used() RETURNS TRIGGER AS $fillDerivedFrom_used$ 
    DECLARE 
    prog  v_varchar(255); 
    current v_varchar(255); 
    BEGIN 
    SELECT u.iduseentity as prog, g.idCreatedEntity as current 
    INTO v_proc, v_current 
    FROM entity e JOIN 
     used u 
     ON e.identity = u.iduseentity JOIN 
     activity a 
     ON a.idactivity = u.idusedactivity JOIN 
     generatedby g 
     ON g.idcreatoractivity = a.idactivity 

    INSERT INTO DERIVEDFROM VALUES (v_prog, v_current) 
END; 

、これはあなたがすべての変数を使用している理由の質問を頼む:

CREATE OR REPLACE FUNCTION process_fillDerivedFrom_used() RETURNS TRIGGER AS $fillDerivedFrom_used$ 
    BEGIN 
    INSERT INTO DERIVEDFROM (prog, current) -- or whatever the column names are 
     SELECT u.iduseentity as prog, g.idCreatedEntity as current 
     FROM entity e JOIN 
      used u 
      ON e.identity = u.iduseentity JOIN 
      activity a 
      ON a.idactivity = u.idusedactivity JOIN 
      generatedby g 
      ON g.idcreatoractivity = a.idactivity;  
END; 
0

私はそれをやった。また、あなたは彼らが列名と競合しないように、変数に名前を付ける必要がありますそれは仕事です、助けてくれてありがとう!

CREATE OR REPLACE FUNCTION process_fillDerivedFromGenby() RETURNS TRIGGER AS $fillDerivedFromgenby$ 
    DECLARE 
    prog  varchar(255); 
    curent varchar(255); 
    BEGIN 

    SELECT u.iduseentity , g.idCreatedEntity into prog,curent 
    FROM entity e 
    JOIN used u ON e.identity=u.iduseentity 
    JOIN activity a ON a.idactivity=u.idusedactivity 
    JOIN generatedby g ON g.idcreatoractivity=a.idactivity 
    WHERE g.idCreatedEntity =NEW.idCreatedEntity; 

    --raise notice 'curent: "%" prog by "%"', curent, prog; 

    INSERT INTO DERIVEDFROM VALUES(prog,curent); 
    return new; 
    END; 

$fillDerivedFromgenby$ LANGUAGE plpgsql; 
CREATE TRIGGER fillDerivedFromgenby AFTER INSERT ON GENERATEDBY 
    FOR EACH ROW EXECUTE PROCEDURE process_fillDerivedFromGenby(); 
関連する問題