我想知道在Postgresql中有什么等同的,如果存在,使用JDBC?
我知道将数组作为函数参数传递的选项,但这似乎限于Postgresql数据类型.@H_301_4@
CREATE TYPE number_with_time AS( _num float,_date timestamp );
CREATE OR REPLACE FUNCTION myfunc(arr number_with_time[])
解决方法
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@
为了避免JDBC中数组处理的复杂性,请传递文本表示.创建一个接受文本参数的函数.@H_301_4@
我不会使用名称“date”作为时间戳.使用这种稍微调整的类型定义:@H_301_4@
CREATE TYPE number_with_time AS( _num float,_ts timestamp );
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@