【问题标题】:Accessing columns of a record programatically in plpgsql在 plpgsql 中以编程方式访问记录的列
【发布时间】:2015-01-23 21:51:42
【问题描述】:

我正在尝试记录更改(如果对表进行了任何更改),但是在尝试循环访问列名时我被卡住了。我收到“数组值必须以“{”开头...第 6 行 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();

【问题讨论】:

标签: postgresql for-loop triggers plpgsql


【解决方案1】:

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

类似这样的:

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

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

【讨论】:

    猜你喜欢
    • 2023-02-08
    • 2012-01-26
    • 2010-09-08
    • 2015-08-31
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多