我有一个数组参数进入plpgsql函数的问题。我的代码在PostgreSQL 8.3中工作,但在9.2.1服务器上调用时失败。
我写了一个显示问题的虚拟函数。这基于我编写的一些第一个plpgsql代码。我知道它很难看,所以如果不能以适用于两种服务器版本的方式逃避我的引号,我愿意接受有关重写此代码的建议,以便它适用于两个服务器版本。实际上无论如何我都愿意接受建议。我不太擅长plpgsql
所以这是演示问题的虚拟代码:
CREATE OR REPLACE FUNCTION get_test(collection text[])
RETURNS text AS
$BODY$
DECLARE
counter int8; directive text; condition text; querytype text;
BEGIN
counter = array_lower(collection, 1);
WHILE (counter <= array_upper(collection, 1)) LOOP
SELECT INTO directive "?column?"[counter] FROM (SELECT collection) AS foo ;
counter = counter + 1;
SELECT INTO condition "?column?"[counter] FROM (SELECT collection) AS foo ;
counter = counter + 1;
SELECT into querytype "?column?"[counter] FROM (SELECT collection) AS foo ;
counter = counter + 1;
END LOOP;
RETURN 'dummy';
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION get_test(text[]) OWNER TO postgres;
collection参数以三个为一组构建(一个简单的字符串,一个SQL条件和另一个字符串)。这是一个在8.3中工作的示例调用,在9.2中失败:
select * from get_test('{"dynamic","(tr.PROJECT_NAME = \'SampleProject\')","1"}')
这会在8.3上按预期返回'dummy',但在9.2中失败: 错误:“SampleProject”处或附近的语法错误 在单引号之后,插入符号指向SampleProject的S,所以我知道我是 不能正确转义嵌入式SQL中的单引号。
我试过这个没有单引号前面的反斜杠,有两个反斜杠,最后有两个单引号,都无济于事。原始代码由Java客户端调用,但我一直在pgadmin3(版本1.16)下测试它,连接到有问题版本的两个服务器,尝试不同的东西。
关于如何使此调用有效的任何想法?
答案 0 :(得分:1)
最可能的原因是standard_conforming_strings
的设置不同
试试这个电话:
在单引号字符串文字中转义单引号的SQL标准方式(以及在PostgreSQL中推荐)是将它们加倍:
SELECT *
FROM get_test('{dynamic,(tr.PROJECT_NAME = ''SampleProject''),1}'::text[])
OR:
SELECT *
FROM get_test('{dynamic,"(tr.PROJECT_NAME = ''SampleProject'')",1}'::text[])
或者您可以使用美元报价来避免多层转义报价
SELECT *
FROM get_test($${dynamic,"(tr.PROJECT_NAME = 'SampleProject')",1}$$::text[])
甚至是ARRAY构造函数:
SELECT *
FROM get_test(ARRAY['dynamic','(tr.PROJECT_NAME = ''SampleProject'')','1'])