2015-05-04 45 views
0

我無法使此代碼正常工作。這是由於插入,更新或刪除觸發器而執行的。相同的代碼將從幾個表觸發器中調用。因此,我事先不知道表名是什麼或它們的列是什麼。有任何想法嗎?執行字符串Postgres

EXECUTE format('INSERT INTO %s VALUES %s', _tbl, (OLD).*); 

誤差約爲字符串沒有引號包圍:

ERROR: column "bangor" does not exist 
LINE 1: INSERT INTO sample_test_table_deletes VALUES (3,bangor,D,"20... 
                 ^

在另一方面,下面的工作:

INSERT INTO my_table VALUES((OLD).*); 

也就是說,當查詢不是通過一個執行塊。

更新(觸發代碼):

CREATE OR REPLACE FUNCTION sample_trigger_func() RETURNS TRIGGER AS $$ 
DECLARE 
    operation_code char; 
    table_name varchar(50); 
    delete_table_name varchar(50); 
    old_id integer; 

BEGIN 
    table_name = TG_TABLE_NAME; 
    delete_table_name = TG_TABLE_NAME || '_deletes'; 

    SELECT SUBSTR(TG_OP, 1, 1)::CHAR INTO operation_code; 

    IF TG_OP = 'DELETE' THEN 
     OLD.mod_op = operation_code; 
     OLD.mod_date = now(); 

     RAISE INFO 'OLD: %', (OLD).name; 

     EXECUTE format('INSERT INTO %s VALUES %s', delete_table_name, (OLD).*); 

    ELSE 
     EXECUTE format('UPDATE TABLE %s SET mod_op = %s AND mod_date = %s' 
         , TG_TABLE_NAME, operation_code, now()); 
    END IF; 

    RETURN NEW; 
END; 
$$ LANGUAGE plpgsql; 
+0

什麼是你的錯誤? '_tbl' com從哪裏來?什麼是觸發器的**完整**代碼? –

+0

嗨。謝謝。我添加了錯誤。 –

+0

那觸發代碼呢?請不要與我們一起玩20個問題... – Kevin

回答

1

特殊變量OLD是不是裏面EXECUTE可見。 (也不是在功能的範圍的任何其它變量。)通在USING構建體:

EXECUTE format('INSERT INTO %I VALUES (($1).*)', _tbl) 
USING OLD; 

此外,使用%I使標識符,不%s

詳情:

+0

但是您添加的觸發器函數有一些其他嚴重問題。 –

+0

嗨,歐文。你能建議改進嗎?他們是否需要以不同問題的答案形式出現?謝謝。 –

+1

@picmate:我回答了您提出的問題,然後看到您稍後添加的功能中存在的問題。這裏的政策是在每個問題上提出一個問題,讓公衆對事情保持清楚和有用。 –