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

Postgresql 在Postgres(plpgsql)中用单引号替换双引号,postgresql,triggers,plpgsql,dynamic-sql,Postgresql,Triggers,Plpgsql,Dynamic Sql,我正在plpgsql中为我的分区表构建一个触发器函数,我的所有逻辑都正常工作,但在将实际记录插入表时遇到了问题 我必须通过变量引用引用我的特定表,以便(据我所知)强制我使用EXECUTE命令,因此: EXECUTE 'INSERT INTO ' || tablename || ' VALUES ' || NEW.*; 但是,这并不能以Postgres的INSERT函数可以理解的方式解包存储在NEW中的记录。它将记录转换为字符串,同时保留其中的所有双引号。即,上述内容在执行时变为以下内容: IN

我正在plpgsql中为我的分区表构建一个触发器函数,我的所有逻辑都正常工作,但在将实际记录插入表时遇到了问题

我必须通过变量引用引用我的特定表,以便(据我所知)强制我使用
EXECUTE
命令,因此:

EXECUTE 'INSERT INTO ' || tablename || ' VALUES ' || NEW.*;
但是,这并不能以Postgres的
INSERT
函数可以理解的方式解包存储在
NEW
中的记录。它将记录转换为字符串,同时保留其中的所有双引号。即,上述内容在执行时变为以下内容:

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认为这些值现在是由于双引号而形成的列

我试图通过以下方式来解决这一问题:

record_text := regexp_replace(NEW.*, '"', '\'', 'gi');
EXECUTE 'INSERT INTO ' || tablename || ' VALUES ' || record_text;
但这样转义单引号会产生错误:

有人能帮我找出如何正确地避开这一引用,或者建议一种完成任务的替代方法吗?

根本不要将值转换为它们的文本表示形式。使用

并正确地转义表名。您可以为此使用:

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

psql:cfs_hgt_trigger_function.sql:36: ERROR:  unterminated quoted string at or near "' || record_text;
LINE 30: ...  EXECUTE 'INSERT INTO ' || tablename || ' VALUES ' || recor...
                                                              ^
EXECUTE format('INSERT INTO %I SELECT $1.*', tablename)
USING NEW;