Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to fix deprecated oracle.sql.ArrayDescriptor, oracle.sql.STRUCT and oracle.sql.StructDescriptor

I use the below JDBC code to call an Oracle stored procedure which takes an Array input.

But the the below three classes are deprecated. How to replace this ?

import oracle.sql.ArrayDescriptor;
import oracle.sql.STRUCT;
import oracle.sql.StructDescriptor;

Java code

        Object[] reportArray = new Object[3]; 
        STRUCT[] struct = new STRUCT[reports.size()];

        ArrayDescriptor arrayDescriptor = new ArrayDescriptor(new SQLName("T_REPORT_TABLE", (OracleConnection) connection), connection);
        StructDescriptor structDescriptor = StructDescriptor.createDescriptor("R_REPORT_OBJECT", connection);

        int arrayIndex = 0;
        for (Report data : reports) {
            reportArray[0] = data.getXXX();
            reportArray[1] = data.getYYY();
            reportArray[2] = data.getZZZ();

            struct[arrayIndex++] = new STRUCT(structDescriptor, connection, reportArray);
        }

        oracle.sql.ARRAY reportsArray = new oracle.sql.ARRAY(arrayDescriptor, connection, struct);
        callableStatement.setArray("T_REPORT_IN", reportsArray);

        callableStatement.executeUpdate();
like image 764
Jay Avatar asked Oct 26 '15 13:10

Jay


People also ask

What is StructDescriptor?

public class StructDescriptor extends TypeDescriptor implements oracle.jdbc.internal.OracleTypeMetaData.Struct, Serializable. Descriptor of a SQL structured object. (That is an SQL Object type). Its main responsibility is understanding how to convert between various representations of such a struct.

What is Oracle Struct?

A Struct object contains a value for each attribute of the SQL structured type that it represents. By default, an instance of Struct is valid as long as the application has a reference to it. All methods on the Struct interface must be fully implemented if the JDBC driver supports the data type.


2 Answers

From oracle API documentation.

ArrayDescriptor

Use factory method OracleConnection.createOracleArray to create an instance of java.sql.Array directly.

STRUCT

Use java.sql.Struct interface for declaration instead of using concrete class oracle.sql.STRUCT.

StructDescriptor

Use factory method Connection.createStruct to create an instance of java.sql.Struct directly.

Here are the full list of Deprecated Classes mentioned in the oracle API documentation.

like image 185
Bacteria Avatar answered Sep 29 '22 16:09

Bacteria


Thanks UUIUI, I now removed the deprecated classes and the fixed code looks as below if anyone needs it later.

    Object[] reportArray = new Object[3]; 
    Struct[] struct = new Struct[reports.size()];

    int arrayIndex = 0;
    for (Report data : reports) {
        reportArray[0] = data.getXXX();
        reportArray[1] = data.getYYY();
        reportArray[2] = data.getZZZ();

        struct[arrayIndex++] = connection.createStruct("R_REPORT_OBJECT", reportArray);
    }

    Array reportsArray = ((OracleConnection) connection).createOracleArray("T_REPORT_TABLE", struct);
    callableStatement.setArray("T_REPORT_IN", reportsArray);

    callableStatement.executeUpdate();          
like image 30
Jay Avatar answered Sep 29 '22 15:09

Jay