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