0

我有一个数组参数进入 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; 

集合参数以三个为一组(一个简单字符串、一个 SQL 条件和另一个字符串)构建。这是一个在 8.3 中有效但在 9.2 中失败的示例调用:

select * from get_test('{"dynamic","(tr.PROJECT_NAME = \'SampleProject\')","1"}') 

这在 8.3 上返回了“虚拟”,但在 9.2 上失败了:错误:“SampleProject”处或附近的语法错误插入符号指向 SampleProject 的 S,就在单引号之后,所以我知道我没有转义嵌入式 SQL 中的单引号正确。

我试过这个没有单引号前面的反斜杠,有两个反斜杠,最后有两个单引号,都无济于事。原始代码由 Java 客户端调用,但我一直在 pgadmin3(1.16 版)下进行测试,连接到相关版本的两台服务器,尝试不同的事情。

关于如何使这个电话起作用的任何想法?

4

1 回答 1

1

最可能的原因是standard_conforming_strings.
试试这个电话:

在单引号字符串文字中转义单引号的 SQL 标准方法(并在 PostgreSQL 中推荐)是将它们加倍:

SELECT *
FROM get_test('{dynamic,(tr.PROJECT_NAME = ''SampleProject''),1}'::text[])

或者:

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'])
于 2013-01-03T17:46:52.557 回答