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