【问题标题】:Execute String Postgres执行字符串 Postgres
【发布时间】:2015-07-13 22:38:59
【问题描述】:

我无法让此代码正常工作。这是作为插入、更新或删除触发器的结果执行的。将从多个表触发器调用相同的代码。因此,我不知道表名是什么或它们的列是什么。有什么想法吗?

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;

【问题讨论】:

  • 你得到的错误是什么? _tbl com 来自哪里?触发器的完整代码是什么?
  • 嗨。谢谢。我添加了错误。
  • 那么触发码呢?请不要和我们玩 20 个问题...
  • 添加了触发代码
  • 你写:This is executed as a result of a delete trigger. 但是你有一个ELSE twig for INSERT / UPDATE .. 这是完全无效的。请澄清你要做什么。我怀疑每个可能的 original 表都有mod_op 列?我建议你开始一个新问题。将此集中在所提出的主题上,并将其余部分放在一个新问题中。

标签: database postgresql triggers plpgsql postgresql-9.1


【解决方案1】:

特殊变量OLDEXECUTE 中不可见。 (函数范围内也没有任何其他变量。)使用 USING 构造传入 values

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

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

详情:

【讨论】:

  • 但是您添加的触发功能还有几个严重的问题。
  • 嗨欧文。您能提出改进建议吗?他们是否需要以对不同问题的答案的形式出现?谢谢。
  • @picmate:我回答了您提出的问题,然后在您稍后添加的功能中看到了问题。这里的政策是每个问题都问一个问题,以使事情对公众保持清晰和有用。
  • 嗨欧文。我开始了一个新问题:stackoverflow.com/questions/30034194/problems-with-the-trigger。希望您能看一看并提出一些建议。
猜你喜欢
  • 1970-01-01
  • 2015-03-04
  • 2015-12-14
  • 1970-01-01
  • 2011-11-26
  • 2019-05-05
  • 1970-01-01
  • 2015-04-26
  • 2023-03-25
相关资源
最近更新 更多