Java 如何使用JDBC在PostgreSQL中传递一组复合类型(UDT)

Java 如何使用JDBC在PostgreSQL中传递一组复合类型(UDT),java,postgresql,jdbc,jboss,composite-types,Java,Postgresql,Jdbc,Jboss,Composite Types,我们正在从Oracle迁移到PostgreSQL Enterprise DB,我们有一个接受类似表结构的存储过程。我们在Oracle中使用了STRUCT,它运行得非常好。现在,该表在PostgreSQL中配置为包含其他UDT-s表的UDT,并在从PostgreSQL层调用时工作 我找不到关于如何使用PostgreSQL JDBC驱动程序将复合类型作为复合类型集合或复合类型数组传递的适当支持或文档 我能够通过传递PGobject的实现来调用该过程。 MygetValue()方法将对象数据转换为以下

我们正在从Oracle迁移到PostgreSQL Enterprise DB,我们有一个接受类似表结构的存储过程。我们在Oracle中使用了STRUCT,它运行得非常好。现在,该表在PostgreSQL中配置为包含其他UDT-s表的UDT,并在从PostgreSQL层调用时工作

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

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

{行(键,1596156006),行(dataHeader2TDataHeader,2782),行(Identifier0120373833), …}

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


PostgreSQL版本是9.3.1、JDK 1.6、JBoss 3.2.8

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

  • 创建自己的字符串表示,并用C、pl/perl、pl/pgsql等编写解析器

  • 使用行()和数组[]构造函数,或

  • 使用原始数据格式

  • JSON(但是这有限制!)

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

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

     ARRAY[ROW(1, 'foo')::bar, ROW(2, 'baz'), ROW(3, 'foobar,')]
    
    最后是原始数据格式。它们使用嵌套的CSV(包括双引号),其中{CSV}表示数组,(CSV)表示行。以上是:

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

    key
    dataHeader2TDataHeader
    identier01
    都应该是列名吗?如果是这样的话,他们就找错地方了。如果没有,至少应该引用。