2017-04-25 117 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

後錯過分號和你定義功能看起來很奇怪 - 你想查詢該四個表EMP上的每一行加入..爲什麼不'insert into 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();