【问题标题】:plpgsql code that worked in postgresql 8.3 fails in 9.2在 postgresql 8.3 中工作的 plpgsql 代码在 9.2 中失败
【发布时间】:2013-01-03 16:02:26
【问题描述】:

我有一个数组参数进入 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 上按预期返回“虚拟”,但在 9.2 上失败: 错误:“SampleProject”处或附近的语法错误 插入符号指向 SampleProject 的 S,就在单引号之后,所以我知道我是 没有正确转义嵌入式 SQL 中的单引号。

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

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

【问题讨论】:

    标签: postgresql quotes plpgsql


    【解决方案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'])
    

    【讨论】:

    • 哇,这是欧文可能解决方案的一个很好的概述。谢谢!我个人喜欢 ARRAY 构造函数解决方案,因为它对我来说看起来最干净。现在,稍后我在选择调用时遇到错误,但如果我无法弄清楚,那将是另一天的问题。再次感谢欧文!
    • @user1945982:如果该功能让您感到困难,请提出另一个问题。在我看来,它可以简化很多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多