Вызов процедуры с табличным типом.Исключение при создании Struct: java.lang.AbstractMethodError: oracle.jdbc.driver.T4CConnection.createStruct - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь создать массив элементов Struct, чтобы передать его в процедуру Oracle.Когда я пытаюсь установить первый элемент массива, я получаю исключение:

java.lang.AbstractMethodError: 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 Ответ

0 голосов
/ 05 июня 2018

Это было связано с ojdbc14.jar .Когда я изменяю его на ojdbc6 (11.2.0.3) , исключение исчезает.Однако в этом случае вы должны изменить метод createArrayOf () на этот:

import oracle.jdbc.OracleConnection;

Array dataArray = ((OracleConnection)connection).createOracleArray(typeTableName, structs);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...