在Postgres中用双引号替换双引号(plpgsql)

时间:2016-05-18 01:32:19

标签: postgresql triggers plpgsql dynamic-sql

我正在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...
                                                              ^

有人可以帮我弄清楚如何正确地逃避单引号,或者建议另一种方法来完成我的任务吗?

1 个答案:

答案 0 :(得分:4)

请勿将转换为所有的文本表示。使用USING clause of EXECUTE传递值。

正确转义表名称。您可以使用format()

EXECUTE format('INSERT INTO %I SELECT $1.*', tablename)
USING NEW;

详细说明: