加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – Postgresql JDBC表值参数

发布时间:2020-12-14 05:17:57 所属栏目:Java 来源:网络整理
导读:MSSQL有一个很好的功能,称为表值参数.它允许您将自定义数据的表传递到存储过程和函数. 我想知道在PostgreSQL中有什么等同的,如果存在,使用JDBC? 我知道将数组作为函数参数传递的选项,但这似乎限于PostgreSQL数据类型. 考虑以下PL / pgSQL代码: CREATE TYPE
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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读