pl/postgresql_将数组传递给PostgreSQL PL / pgSQL函数

pl/postgresql

通过PostgreSQL数组将字符串集合传递给PL / pgSQL存储函数可能很方便。 通常,这是一件非常容易完成的事情,但是这篇文章演示了将数组从JDBCpsql传递给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代码,如以下屏幕快照所示。

creationStoredFunctionPrintStrings

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''}'); 如下一个屏幕快照所示。

printStringsStoredFunctionPrintsThreeStrings

数组也可以从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.ArrayConnection.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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值