首页 > 解决方案 > 使用 to_jsonb(NEW) 并执行

问题描述

CREATE OR REPLACE FUNCTION change_trigger() RETURNS trigger AS $$
  BEGIN
    INSERT INTO static_table_name (content) VALUES (to_jsonb(NEW));
  END;
$$ LANGUAGE 'plpgsql' SECURITY DEFINER;

↑ 正在工作,但我希望有机会发送目标表名以进行插入。

所以,通过上面的代码,我可以使用 dymanic_table_name,

CREATE OR REPLACE FUNCTION change_trigger() RETURNS trigger AS $$
  DECLARE
    dymanic_table_name TEXT;
  BEGIN
    dymanic_table_name := TG_ARGV[0];

    EXECUTE 'INSERT INTO '  || dymanic_table_name || ' (content) VALUES (' || to_json(NEW) || ');';
  END;
$$ LANGUAGE 'plpgsql' SECURITY DEFINER;

但它失败了,当尝试插入'to_json'函数的结果时......

错误:

ERROR:  "{"またはその近辺で構文エラー
LINE 1: ..._table (content) VALUES ({"id":43,"...
                                    ^

※ 对不起日语语法(*´艸`)

标签: postgresqlplpgsqldatabase-triggerjsonb

解决方案


您必须像这样使用动态 SQL:

EXECUTE
   format(
      'INSERT INTO %I (content) VALUES (to_json($1))', 
      dymanic_table_name
   )
   USING NEW;

推荐阅读