【问题标题】:How to pass NEW.* to EXECUTE in trigger function如何在触发器函数中将 NEW.* 传递给 EXECUTE
【发布时间】:2016-04-05 09:42:12
【问题描述】:

我有一个简单的任务是将巨大的 MD5 值插入表(分区表)中,并创建了一个触发器和一个触发器函数来代替 INSERT 操作。在函数中,我检查了NEW.md5 的前两个字符以确定应该插入哪个表。

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;

问题是如何将NEW.*连接到SQL语句中?

【问题讨论】:

  • 始终包含您的 Postgres 版本。而且我非常喜欢看到完整的函数定义,包括页眉和页脚。

标签: postgresql triggers plpgsql dynamic-sql


【解决方案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,而不是 format() 中的 %s)。

更多细节:

【讨论】:

    猜你喜欢
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 2022-10-15
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    相关资源
    最近更新 更多