微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – Postgresql JDBC表值参数

MSsql一个很好的功能,称为表值参数.它允许您将自定义数据的表传递到存储过程和函数.

我想知道在Postgresql中有什么等同的,如果存在,使用JDBC?
我知道将数组作为函数参数传递的选项,但这似乎限于Postgresql数据类型.

考虑以下PL / pgsql代码

CREATE  TYPE number_with_time AS(
_num   float,_date  timestamp
);

和这个函数头:

CREATE OR REPLACE FUNCTION myfunc(arr number_with_time[])

任何人都可以使用JDBC驱动程序使用用户定义的数据类型的数组来调用函数吗?

解决方法

假设你想从客户端传递值.如果数据库中已存在值,则还有其他更简单的方法

composite_type数组的语法

I kNow about the option of passing arrays as function parameters,but
that seems limited to Postgresql data types.

你可以通过什么似乎受到Java Types and JDBC Types的限制,而且似乎没有数组类型的规定,而不是说复合值的数组…

但是,您可以随时传递文本表示.我正在建立两个基本事实:

1)Per documentation:

Arrays of any built-in or user-defined base type,enum type,or
composite type
can be created. Arrays of domains are not yet supported.

大胆强调我的因此,在您创建了您的问题中定义的类型number_with_time之后,或者定义了一个具有相同列的表,它会自动在系统中注册相应的复合类型 – 您还可以自动使用数组类型为number_with_time [].

2)每个值都有一个文本表示.

因此,还有一个text_with_time []的文本表示形式:

'{"(1,2014-04-20 20:00:00)","(2,2014-04-21 21:00:00)"}'::number_with_time[]

函数调用

实际的函数调用取决于您的函数中定义的返回值 – 这在您的问题中是隐藏的.

为了避免JDBC中数组处理的复杂性,请传递文本表示.创建一个接受文本参数的函数.

我不会使用名称“date”作为时间戳.使用这种稍微调整的类型定义:

CREATE TYPE number_with_time AS(
   _num float,_ts  timestamp
);

简单的sql函数

CREATE OR REPLACE FUNCTION myfunc_sql(_arr_txt text)
  RETURNS integer AS       -- example
$func$
SELECT sum(_num)::int
FROM   unnest (_arr_txt::number_with_time[]) x
WHERE  _ts > '2014-04-19 20:00:00';
$func$
LANGUAGE sql;

呼叫:

SELECT myfunc_sql('{"(1,2014-04-21 21:00:00)"}');

SQL Fiddle演示:

>以上sql函数
> PL / pgsql变体
>复合类型数组的几个语法变体
>函数调用.

像任何其他功能一样调用函数,使用简单的文本参数:

CallableStatement myProc = conn.prepareCall("{ ? = call myfunc_sql( ? ) }");
myProc.registerOutParameter(1,Types.VARCHAR);
// you have to escape double quotes in a Java string!
myProc.setString(2,"{\"(1,2014-04-20 20:00:00)\",\"(2,2014-04-21 21:00:00)\"}");
myProc.execute();
String mySum = myProc.getInt(1);
myProc.close();

Details in the Postgres JDBC manual here.

通过JDBC返回整个表的示例:
Return rows from a PL/pgSQL function

原文地址:https://www.jb51.cc/java/122949.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐