java – Postgresql JDBC表值参数
MSSQL有一个很好的功能,称为表值参数.它允许您将自定义数据的表传递到存储过程和函数.
我想知道在PostgreSQL中有什么等同的,如果存在,使用JDBC? 考虑以下PL / pgSQL代码: CREATE TYPE number_with_time AS( _num float,_date timestamp ); 和这个函数头: CREATE OR REPLACE FUNCTION myfunc(arr number_with_time[]) 任何人都可以使用JDBC驱动程序使用用户定义的数据类型的数组来调用该函数吗? 解决方法
假设你想从客户端传递值.如果数据库中已存在值,则还有其他更简单的方法…
composite_type数组的语法
你可以通过什么似乎受到Java Types and JDBC Types的限制,而且似乎没有数组类型的规定,而不是说复合值的数组… 但是,您可以随时传递文本表示.我正在建立两个基本事实: 1)Per documentation:
大胆强调我的因此,在您创建了您的问题中定义的类型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函数 像任何其他功能一样调用函数,使用简单的文本参数: 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返回整个表的示例: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |