pl/postgresql
通过PostgreSQL数组将字符串集合传递给PL / pgSQL存储函数可能很方便。 通常,这是一件非常容易完成的事情,但是这篇文章演示了将数组从JDBC或psql传递给PL / pgSQL函数时要注意的一些细微差别。
下一个代码清单是关于人为的PL / pgSQL存储函数的,将在本文中使用。 该函数接受文本变量数组,根据数组长度在它们上循环,并通过PL / pgSQL RAISE语句报告这些字符串。
printStrings.sql
CREATE OR REPLACE FUNCTION printStrings(strings text[]) RETURNS void AS $printStrings$
DECLARE
number_strings integer := array_length(strings, 1);
string_index integer := 1;
BEGIN
WHILE string_index <= number_strings LOOP
RAISE NOTICE '%', strings[string_index];
string_index = string_index + 1;
END LOOP;
END;
$printStrings$ LANGUAGE plpgsql;
可以使用\ir
在psql中执行文件printStrings.sql
的上述PL / pgSQL代码,如以下屏幕快照所示。
PostgreSQL数组文档中的“ 数组值输入 ”部分介绍了使用数组作为参数调用PL / pgSQL存储函数的语法。 本文档说明“数组常量的通用格式”为'{ val1 delim val2 delim ... }'
,其中delim
在大多数情况下以逗号( ,
)分隔。 同一文档显示了一个示例: '{{1,2,3},{4,5,6},{7,8,9}}'
。 本示例提供了三个整数数组,每个数组中都有三个整数。
刚刚显示的数组文字语法可以直接用于数字类型,例如所示示例中的整数。 但是,对于字符串,需要对字符串周围的引号进行转义,因为整个数组( '{}'
)周围已经有引号。 通过将数组中的每个字符串都用两边的单引号引起来来完成转义。 例如,要调用仅在三个字符串“ Inspired”,“ Actual”和“ Events”上显示的存储函数,可以在psql中使用以下语法: SELECT printstrings('{''Inspired'', ''Actual'', ''Events''}');
如下一个屏幕快照所示。
数组也可以从Java代码传递给PL / pgSQL函数。 这提供了一种将Java集合传递给PL / pgSQL函数的简便方法。 以下Java代码段演示了如何使用JDBC调用前面显示的存储函数。 因为此存储的函数返回void
(它更像是存储过程 ),所以JDBC代码不需要调用任何CallableStatement的重写的registerOutParameter()方法。
使用Java数组调用存储函数的JDBC代码
final CallableStatement callable =
connection.prepareCall("{ call printstrings ( ? ) }");
final String[] strings = {"Inspired", "Actual", "Events"};
final Array stringsArray = connection.createArrayOf("varchar", strings);
callable.setArray(1, stringsArray);
callable.execute();
callable.close();
Java应用程序通常使用Java集合而不是使用数组,但是幸运的是, Collection提供了toArray(T [])以便轻松获取集合的数组表示形式。 例如,下一个代码清单是从上一个代码清单改编而来的,但是针对的是ArrayList而不是数组。
带有Java集合的JDBC代码调用存储的函数
final CallableStatement callable =
connection.prepareCall("{ call printstrings ( ? ) }");
final ArrayList<String> strings = new ArrayList<>();
strings.add("Inspired");
strings.add("Actual");
strings.add("Events");
final Array stringsArray =
connection.createArrayOf(
"varchar",
strings.toArray(new String[strings.size()]));
callable.setArray(1, stringsArray);
callable.execute();
callable.close();
结论
将数组作为参数传递给PostgreSQL PL / pgSQL存储函数的能力是一个简单的过程。 这篇文章专门演示了使用java.sql.Array和Connection.createArrayOf(String )将字符串数组(包括适当的转义)从psql传递给PL / pgSQL存储函数,以及将字符串数组从JDBC从JDBC传递给PL / pgSQL存储函数。 ,Object []) 。
翻译自: https://www.javacodegeeks.com/2015/09/passing-arrays-to-a-postgresql-plpgsql-function.html
pl/postgresql