我正在plpgsql中为我的分区表构建一个触发器函数,并且我已经完成了所有逻辑工作,但是在将实际记录插入到我的表中时遇到了麻烦。
我必须通过变量引用引用我的特定表,以便(据我所知)强制我使用EXECUTE
命令,如下所示:
EXECUTE 'INSERT INTO ' || tablename || ' VALUES ' || NEW.*;
但是,这并不会以Postgres'NEW
函数可以理解的方式解压缩存储在INSERT
中的记录。它将记录转换为字符串,同时保留其中的所有双引号。即以上在执行时变成以下内容:
INSERT INTO cfs_hgt_05152016_05202016
VALUES ("2016-05-16 00:00:00","2016-05-12 06:00:00",HGT,"1000 mb",9,-71,-38.5371)
问题是Postgres认为由于双引号,这些值现在是列。
COPY cfs_hgt_master, line 1: ""2016-05-16 00:00:00","2016-05-12 06:00:00","HGT","1000 mb",9,-71,-38.5371" ERROR: column "2016-05-16 00:00:00" does not exist
我试图通过以下方法解决这个问题:
record_text := regexp_replace(NEW.*, '"', '\'', 'gi');
EXECUTE 'INSERT INTO ' || tablename || ' VALUES ' || record_text;
但是像这样逃避单引号会产生错误:
psql:cfs_hgt_trigger_function.sql:36: ERROR: unterminated quoted string at or near "' || record_text; LINE 30: ... EXECUTE 'INSERT INTO ' || tablename || ' VALUES ' || recor... ^
有人可以帮我弄清楚如何正确地逃避单引号,或者建议另一种方法来完成我的任务吗?
答案 0 :(得分:4)
请勿将值转换为所有的文本表示。使用USING
clause of EXECUTE
传递值。
正确转义表名称。您可以使用format()
:
EXECUTE format('INSERT INTO %I SELECT $1.*', tablename)
USING NEW;
详细说明: