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

Postgresql 在plpgsql中以编程方式访问记录的列,postgresql,for-loop,triggers,plpgsql,Postgresql,For Loop,Triggers,Plpgsql,我正在尝试记录对表所做的任何更改,但在尝试循环遍历列名时,我被卡住了。我收到一个“数组值必须以“{”…第6行开始,用于超选行”错误。我不明白为什么会发生这种情况。函数编译正常,但运行更新会导致该错误 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 rig

我正在尝试记录对表所做的任何更改,但在尝试循环遍历列名时,我被卡住了。我收到一个“数组值必须以“{”…第6行开始,用于超选行”错误。我不明白为什么会发生这种情况。函数编译正常,但运行更新会导致该错误

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();

要按名称获取新旧列,您必须使用exec和一系列类型转换

大概是这样的:

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

这可能会使某些浮点数的值不精确

为什么不使用现有的解决方案呢?或者使用名称为“无”的@a_horse_将尝试:第一个注释正确的类型是postgres内置的
名称
,AIUI是一种varchar[64],第二个注释,这一点都不容易。