2015-05-04 71 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:我回答了您提出的问题,然后看到您稍后添加的功能中存在的问题。这里的政策是在每个问题上提出一个问题,让公众对事情保持清楚和有用。 –