从java调用带有UDT参数的postgres函数给SQL尚未实现异常

Posted

技术标签:

【中文标题】从java调用带有UDT参数的postgres函数给SQL尚未实现异常【英文标题】:calling postgres function with UDT parameter from java giving SQL is not yet implemented exception 【发布时间】:2015-10-12 11:04:59 【问题描述】:

我正在将 postgres9.4 EDB 用于带有 UDT(用户定义类型)的函数,给出 Is Not Yet Implemented 异常。 我正在为 JDBC 使用 postgres 驱动程序 postgresql-9.4-1203.jdbc41.jar。 上面的jar是否支持UDT功能?这个实现是部分的吗?

请帮帮我。

下面是代码,

public static void oracleToPosgresUDTCall() 
        System.out.println("@@@ inside oracleToPosgresUDTCall...");
          Connection c = null;
          try 
             Class.forName("org.postgresql.Driver");
             c = DriverManager
                .getConnection("jdbc:postgresql://localhost:5433/pgtest", "postgres", "root");
             System.out.println(c.getMetaData().getDriverVersion());


             //you can mad your UDT to pojo here Great !!!
             Map<String, Class<?>> m = c.getTypeMap();
             m.put("typ_address", Address.class);
             m.put("typ_test", AddressTypeTest.class);
             c.setTypeMap(m);

             // Procedure call
             CallableStatement cstmt = c.prepareCall("call fn_test_t(?,?,?)");

             cstmt.setString(1, "791000252423");

             cstmt.registerOutParameter(2, Types.ARRAY);
             cstmt.registerOutParameter(3, Types.ARRAY);


                boolean b = cstmt.execute();

             Array arr = cstmt.getArray(1); //output array starts from index 1

             System.out.println("arr:" + arr.getBaseTypeName());
             Object obj = arr.getArray();

             System.out.println("Address obj:" + obj);
             Address[] a = (Address[])obj;
             System.out.println("Address obj:" + a[0].getAdd1());
             System.out.println("Address obj:" + a[0].getTypeTest().getT1());

             System.out.println("=======================================================");
             //MORE

             List<Address> list = Arrays.asList(a);

             for(Address aa: list)
                 System.out.println(aa.getAdd1());
                 System.out.println(aa.getAdd2());
                 System.out.println("t1:" + aa.getTypeTest().getT1());
             



             cstmt.close();

           catch (Exception e) 
             e.printStackTrace();
             System.err.println(e.getClass().getName()+": "+e.getMessage());
             System.exit(0);
          
          System.out.println("Opened database successfully");
       

【问题讨论】:

【参考方案1】:

Postgres 官方驱动版本不支持大部分 JDBC 一致性。

非官方驱动链接,

pgjdbc-ng

PGJDBC-NG 0.5 API

【讨论】:

以上是关于从java调用带有UDT参数的postgres函数给SQL尚未实现异常的主要内容,如果未能解决你的问题,请参考以下文章

带有 jsonb 参数的 Postgres 函数

如何使用 JNI 从 JAVA 调用带有 C++ 参数的函数?

postgres:从带有参数的查询中获取可执行查询

没有函数匹配给定的名称和参数类型。在带有 python 的 postgres 中

为选择中的每一行调用一个函数 - Postgres

如何在带有 Postgres 的动态框架中使用窗口函数中的列值?