我有一个数组参数进入 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 版)下进行测试,连接到相关版本的两台服务器,尝试不同的事情。
关于如何使这个电话起作用的任何想法?