クライアントから値を渡したいと仮定します 。値がデータベースにすでに存在する場合は、他のより簡単な方法があります。
composite_typeの配列の構文
渡すことができるものは、JavaタイプとJDBCタイプ 、および複合値の配列は言うまでもなく、配列型の規定はないようです...
ただし、いつでもtext
を渡すことができます 表現。私は2つの基本的な事実に基づいています:
- マニュアル の引用 :
大胆な強調鉱山。したがって、タイプnumber_with_time
を作成した後 質問で定義されているように、またはシステムに行タイプを自動的に登録する同じ列を持つテーブルを定義している場合は、配列タイプnumber_with_time[]
を使用することもできます。 。
text
があります すべての表現 値。
したがって、number_with_time[]
のテキスト表現もあります。 :
'{"(1,2014-04-20 20:00:00)","(2,2014-04-21 21:00:00)"}'::number_with_time[]
関数呼び出し
実際の関数呼び出しは、関数で定義された戻り値によって異なります。これは質問に隠されています。
JDBCでの配列処理による複雑さを回避するには、text
を渡します。 表現。 text
を使用して関数を作成します パラメータ。
timestamp
に「date」という名前を使用するつもりはありません 。このわずかに調整された型定義の操作:
CREATE TYPE number_with_time AS(
_num float
, _ts timestamp
);
単純なSQL関数:
CREATE OR REPLACE FUNCTION myfunc_sql(_arr_txt text)
RETURNS integer -- example
LANGUAGE sql AS
$func$
SELECT sum(_num)::int
FROM unnest (_arr_txt::number_with_time[]) x
WHERE _ts > '2014-04-19 20:00:00';
$func$;
電話:
SELECT myfunc_sql('{"(1,2014-04-20 20:00:00)","(2,2014-04-21 21:00:00)"}');
db <> fiddle こちら
古い
デモンストレーション:
- SQL関数の上
- PL/pgSQLバリアント
- 複合型の配列のいくつかの構文バリアント
- 関数呼び出し
単純なtext
を使用して他の関数と同じように関数を呼び出します パラメータ:
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();
JDBCを介してテーブル全体を返す例: