【问题标题】:How to pass a set of composite types (UDTs) in PostgreSQL using JDBC如何使用 JDBC 在 PostgreSQL 中传递一组复合类型 (UDT)
【发布时间】:2013-12-07 21:38:32
【问题描述】:

我们正在从 Oracle 迁移到 PostgreSQL Enterprise DB,并且我们有一个接受类表结构的存储过程。我们将 STRUCT 与 Oracle 一起使用,效果非常好。现在该表在 PostgreSQL 中配置为包含其他 UDT 表的 UDT,并且在从 PostgreSQL 层调用时它可以工作。

我找不到有关如何使用 PostgreSQL JDBC 驱动程序将复合类型作为复合类型集合或复合类型数组传递的适当支持或文档。

我能够通过传递我的 PGobject 实现来调用该过程。 我的getValue() 方法将对象数据转换为以下格式的字符串:

{row(key,1596156006),row(dataHeader2TDataHeader,2782),row(identifier01,20373833), ...}

但我从 PostgreSQL 收到错误“格式错误的数组文字”。

PostgreSQL 版本为 9.3.1,JDK 1.6,JBoss 3.2.8

【问题讨论】:

  • keydataHeader2TDataHeaderidentifier01 都应该是列名吗?如果是这样,他们就在错误的地方。如果没有,至少应该引用它们。

标签: java postgresql jdbc jboss composite-types


【解决方案1】:

在 PostgreSQL 中基本上有几个选项:

  1. 创建您自己的字符串表示并用 C、pl/perl、pl/pgsql 或类似语言编写解析器。

  2. 使用 ROW() 和 ARRAY[] 构造函数,或者

  3. 使用原始数据格式。

  4. JSON(但这有限制!)

如果您要编写自己的字符串表示,则需要密切注意它是如何在输入和输出上解析的。您甚至可以创建自己的类型而不使用复合类型。这在确保您始终了解输入和输出公式方面具有一些有用的好处。

ROW() 和 ARRAY[] 构造函数可以一起使用。在这种情况下,您可以:

 ARRAY[ROW(1, 'foo')::bar, ROW(2, 'baz'), ROW(3, 'foobar,')]

最后是原始数据格式。这些使用嵌套的 CSV(包括双引号),其中 {csv} 代表一个数组, (csv) 代表一行。上面是这样的:

 '{"(1,foo)","(2,baz)","(3,""foobar,"")"}'

【讨论】:

    猜你喜欢
    • 2019-09-01
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 2022-10-20
    相关资源
    最近更新 更多