【发布时间】:2017-11-25 15:21:04
【问题描述】:
我正在寻找有关如何调用具有复合类型数组参数的 postgres 函数的建议。有人问过类似的问题,但我找到了满意的答案。
我有以下复合类型:
CREATE TYPE collect.event_record AS (
event_type integer
, event_timestamp timestamp without time zone
, event_data text
, event_import_id integer
);
我有以下功能:
CREATE OR REPLACE FUNCTION collect.insert_events(
fail_on_duplicates boolean,
source_public_id text,
event_records collect.event_record[])
RETURNS integer AS
...
在 postgres 方面,一切似乎都运行良好。现在我只需要从 java/kotlin 调用它。
我们使用这个版本的 postgres 驱动:
compile group: "org.postgresql", name: "postgresql", version: "9.4.1212"
在PreparedStatement 上有一种方法似乎是我正在寻找的:
void setArray (int parameterIndex, Array x) throws SQLException;
数组类型是java.sql.Array,据我所知可以使用 Connection 对象创建:
Array createArrayOf(String typeName, Object[] elements) throws SQLException;
但是,在这里我不确定要输入什么。typeName 应该是什么?我想我应该创建一个与复合类型匹配的类,并根据需要对字段进行序列化,或者它是java.sql.Struct 的数组。
我一直在搜索示例,但它们似乎主要处理原始类型,这对我的情况没有帮助。
另一种方法是重构 insert_events 以接受多个原始类型数组,类似于我的对象的列视图。
另一种选择是发送一个 JSON 数组,我在 postgres 函数中将其转换为 collect.event_record[] 数组。
但是,我想找到一种方法来保留我目前拥有的 postgres 函数签名。
非常感谢任何想法。
【问题讨论】:
-
From this doc
typeName确实应该是您要创建数组的类型的字符串表示形式。所以在你的情况下它应该是“collect.event_record”。
标签: java postgresql jdbc kotlin