在PostgreSQL插入语句中转义特殊字符

时间:2018-10-03 19:04:13

标签: postgresql plpgsql dynamic-sql

我正在编写一个函数,要求我将一些JavaScript代码存储在PostgreSQL数据库表中(这是必需的)。我正在寻找一种“懒惰”的方式来执行此操作,而无需修改我的PostgreSQL插入语句以在JavaScript代码中可能发生的每个实例处转义特殊字符。我主要是想避免在JavaScript代码变得更长的情况下进行转义。由于这可能会很快变得混乱。 PostgreSQL似乎提供以下功能:

  1. quote_literal()
  2. quote_ident()

参考:PostgreSQL String Formatting Functions

已经测试了这两个常见错误,我遇到了以下错误:

错误:“”处或附近的带引号的标识符终止:是

乍一看似乎是我的问题出在格式化的JavaScript文本本身上。

我是否有一种“懒惰”方式来避免转义所有这些特殊字符而不必手动执行?本质上,我想将此代码转储到变量中,并使用存储的变量执行插入操作,而无需(理想情况下)或对存储的JScript文本进行最小程度的修改。

下面是我的代码的示例:

CREATE OR REPLACE FUNCTION abc.my_function(text, text, text, text, text[])
     RETURNS void AS $body$
DECLARE
     -- Variable Declarations here
     jscript TEXT := quote_ident('/* JScript Comments Here*/ $(document).ready(function(){
     // Initialize Datatable ...
     $('#Index').Datatable({
     "paging": true, // comment here
     "responsive": true, // comment here 
     "pageLength": 25, // comment here
     "columnDefs": [ {
     ...
     ...
     ...
          }]
     });
'); 


BEGIN
     ...
     ...
     ...
     -- Insert static HTML
     execute 'Insert into abc.my_table(file, data, gen_flag) values('||'''main.js||','||jscript||','|| '''N''' || ')';
     ...
     ...
     ...


END; 
$body$
     LANGUAGE 'plpgsql' VOLATILE;

1 个答案:

答案 0 :(得分:2)

主要问题是,您正在使用quote_ident来引用您应该在其中使用quote_literal标识符(列名,表名...)用于正确引用文字值。

要声明变量并分配值,可以使用第二级美元报价,这样您就不必担心值内的单引号了:

declare 
  jscript TEXT := $js$
     /* JScript Comments Here*/
     $(document).ready(function(){
       // Initialize Datatable ...
       $(#Index').Datatable({
       "paging": true, // comment here
       "responsive": true, // comment here 
       "pageLength": 25, // comment here
       "columnDefs": [ {
       ...
       ...
       ...}]
     });
  $js$;

最好使用format()函数创建动态SQL,该函数负责正确引用:

execute format('Insert into abc.my_table(file, data, gen_flag) values(%L, %L, %L), 'main.js',jscript, 'N')';

但是您根本不需要动态SQL,您只需编写:

insert into abc.my_table(file, data, gen_flag) values('main.js', jscript, 'N');

在线演示:https://dbfiddle.uk/?rdbms=postgres_10&fiddle=81b36bb1d3f246637186a419a9b337d4