在plpgsql中以编程方式访问记录的列

时间:2015-01-23 21:51:42

标签: postgresql for-loop triggers plpgsql

我正在尝试记录更改,如果对表进行了更改,但是在尝试循环列名时我遇到了问题。我收到一个"数组值必须以" {" ...第4行在FOR over SELECT行"错误。我不明白为什么会这样。..函数编译好,但运行更新会产生错误。

CREATE TABLE test(x varchar(50))

CREATE OR REPLACE FUNCTION testF()
RETURNS trigger
AS $$
DECLARE 
 col varchar[255]; //don't know if this is the right variable type to use
BEGIN
  IF OLD.* IS DISTINCT FROM NEW.* THEN
    FOR col in SELECT column_name FROM information_schema.columns WHERE table_schema = TG_TABLE_SCHEMA AND table_name = TG_TABLE_NAME LOOP
      INSERT INTO test(x) VALUES(col||'oldValue:'||OLD.col||'newValue:'||NEW.col); //I want to put the name and the old and new values in a varchar field
    END LOOP;
END IF;
RETURN NULL;
END $$ LANGUAGE plpgsql;

CREATE TRIGGER testT AFTER UPDATE
ON "triggerTable" FOR EACH ROW EXECUTE PROCEDURE testF();

1 个答案:

答案 0 :(得分:1)

要按名称获取OLD或NEW列,您必须使用exec进行一系列类型转换。

类似的东西:

execute '('||quote_literal(NEW::text)||'::'||quote_ident(pg_typeof(NEW))||
  ').'||quote_ident(col)||'::text';

这可能会让你得到一些花车的不精确值