java – Postgresql JDBC表值参数

前端之家收集整理的这篇文章主要介绍了java – Postgresql JDBC表值参数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
MSsql有一个很好的功能,称为表值参数.它允许您将自定义数据的表传递到存储过程和函数.

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

考虑以下PL / pgsql代码:@H_301_4@

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

和这个函数头:@H_301_4@

CREATE OR REPLACE FUNCTION myfunc(arr number_with_time[])

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

解决方法

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

composite_type数组的语法@H_301_4@

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

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

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

1)Per documentation:@H_301_4@

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.@H_301_4@

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

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

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

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

函数调用@H_301_4@

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

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

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

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

简单的sql函数:@H_301_4@

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;

呼叫:@H_301_4@

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

SQL Fiddle演示:@H_301_4@

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

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

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.@H_301_4@

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

猜你在找的Java相关文章