执行String Postgres

时间:2015-05-04 13:52:53

标签: database postgresql triggers plpgsql postgresql-9.1

我无法使用此代码。这是由插入,更新或删除触发器执行的。将从几个表触发器调用相同的代码。因此,我不知道预先知道表名是什么或列是什么。有什么想法吗?

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;

1 个答案:

答案 0 :(得分:1)

OLD中看不到特殊变量EXECUTE。 (也不是函数范围内的任何其他变量。)使用USING结构传入

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

另外,使用%I作为标识符,而不是%s

详细说明: