在postgresql 8.3中工作的plpgsql代码在9.2中失败

时间:2013-01-03 16:02:26

标签: postgresql quotes plpgsql

我有一个数组参数进入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)下测试它,连接到有问题版本的两个服务器,尝试不同的东西。

关于如何使此调用有效的任何想法?

1 个答案:

答案 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'])