代码之家  ›  专栏  ›  技术社区  ›  Kirill

使用表类型调用过程。创建结构时出现异常:java.lang.AbstractMethod错误:oracle.jdbc.driver.t4cconnection.createStruct

  •  0
  • Kirill  · 技术社区  · 7 年前

    我尝试创建一个结构元素数组,将其传递给Oracle过程。当我试图设置数组的第一个元素时,收到一个异常:

    java.lang.AbstractMethod错误: oracle.jdbc.driver.t4cconnection.createstruct

    可能是什么原因以及如何纠正? 我的例子:

    import java.sql.Array;
    import java.sql.CallableStatement;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.Struct;
    
    public class TypesApp {
        public static void main(String[] args) throws Exception {
            Class.forName("oracle.jdbc.OracleDriver");
            Connection connection =
                    DriverManager.getConnection("jdbc:oracle:thin:@10.0.0.20:1521:dw", "user", "password");
    
        final String typeName = "T_DEMO_OBJECT";
        final String typeTableName = "T_DEMO_OBJECTS";
    
        Struct[] structs = new Struct[2];
    
        //Here I get the Exception
        structs[0] = connection.createStruct(typeName, new Object[]{23, "Testobject 1"});
        structs[1] = connection.createStruct(typeName, new Object[]{40, "Testobject 2"});
    
        CallableStatement callableStatement = connection.prepareCall("{call p_receive_demo_objects(?)}");
    
        Array dataArray = connection.createArrayOf(typeTableName, structs);
        callableStatement.setArray(1, dataArray);
    
        callableStatement.executeUpdate();
    }
    

    }

    我以前版本的相同操作(使用ojdbc6)可以工作,但是它将数字正确地保存到数据库中,但是所有字符串都是空的,所以我尝试另一种方法。以前版本:

    import oracle.sql.ARRAY;
    import oracle.sql.ArrayDescriptor;
    import oracle.sql.STRUCT;
    import oracle.sql.StructDescriptor;
    
    import java.sql.CallableStatement;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.Types;
    
    public class InitMethod2 {
    
        public static void main(String[] args) throws Exception {
            Class.forName("oracle.jdbc.OracleDriver");
            Connection connection =
                    DriverManager.getConnection("jdbc:oracle:thin:@10.0.0.20:1521:dw", "user", "password");
    
            final String typeName = "T_DEMO_OBJECT";
            final String typeTableName = "T_DEMO_OBJECTS";
    
            final StructDescriptor structDescriptor = StructDescriptor.createDescriptor(typeName.toUpperCase(), connection);
    
            final ArrayDescriptor arrayDescriptor =
                    ArrayDescriptor.createDescriptor(typeTableName.toUpperCase(), connection);
            final ARRAY demoObjectsFromJava = new ARRAY(arrayDescriptor, connection, new STRUCT[]{
                    // STRUCTS are created with the struct descriptor and a generic object array containing the values of the
                    // attributes of the T_DEMO_OBJECT
                    new STRUCT(structDescriptor, connection, new Object[]{23123, "Testobject 1"}),
                    new STRUCT(structDescriptor, connection, new Object[]{42123, "Testobject 2"})});
            CallableStatement cs = connection.prepareCall("{call p_receive_demo_objects(?)}");
            cs.setObject(1, demoObjectsFromJava, Types.ARRAY);
            cs.execute();
            cs.close();
    
            connection.close();
        }
    
    }
    

    我的pom.xml具有以下依赖项: enter image description here

    1 回复  |  直到 7 年前
        1
  •  0
  •   Kirill    7 年前

    是因为 OJDBC14JAR . 当我把它改成 OJDBC6(11.2.0.3) 例外情况消失了。 但是在这种情况下,您应该将createArrayOf()方法更改为以下方法:

    import oracle.jdbc.OracleConnection;
    
    Array dataArray = ((OracleConnection)connection).createOracleArray(typeTableName, structs);