How to pass NEW.* to EXECUTE in trigger function

时间:2016-04-04 16:36:52

标签: postgresql triggers plpgsql dynamic-sql

I have a simple mission is inserting huge MD5 values into tables (partitioned table), and have created a trigger and also a trigger function to instead of INSERT operation. And in function I checked the first two characters of NEW.md5 to determine which table should be inserted.

DECLARE
  tb text;
BEGIN
  IF TG_OP = 'INSERT' THEN
    tb = 'samples_' || left(NEW.md5, 2);
    EXECUTE(format('INSERT INTO %s VALUES (%s);', tb, NEW.*)); <- WRONG
  END IF;
  RETURN NULL;
END;

The question is how to concat the NEW.* into the SQL statement?

1 个答案:

答案 0 :(得分:1)

最好使用USING clause of EXECUTE

CREATE FUNCTION foo ()
  RETURNS trigger AS
$func$
BEGIN
  IF TG_OP = 'INSERT' THEN
     EXECUTE format('INSERT INTO %s SELECT $1.*'
                  , 'samples_' || left(NEW.md5, 2);
     USING NEW;
  END IF;
  RETURN NULL;
END
$func$ LANGUAGE plpgsql;

并且EXECUTE不需要括号 并且您知道标识符会折叠为小写,除非在必要时引用(%I而不是%s中的format()

更多详情: