Wie lese ich eine ARRAY von Typen, die von einem gespeicherten Prozess mit Java zurückgegeben wurden?

Dies ist eine Fortsetzung der Frage, die an der folgenden Stelle gestellt wurde:Java-Programm zum Übergeben der Bean-Liste an eine gespeicherte Oracle-Prozedur - Übergeben Sie die gesamte Liste auf einmal, anstatt Objekte nacheinander anzuhängen

Ich habe versucht, die gespeicherte Prozedur zu verbessern, die in der obigen Linkposition erwähnt wird, und bin in der Implementierung verwirrt. Anstelle von VARCHAR2 als Ausgabe der Prozedur möchte ich jetzt NUM_ARRAY als Ausgabe der Prozedur zurückgeben. Können Sie mir bitte bei der Implementierung der Logik zum Lesen von NUM_ARRAY in meinem Java-Code helfen? Normalerweise wird die Ausgabe mit Map out = super.execute (inParams) zurückgegeben. Wie kann ich nun NUM_ARRAY in meine Bean extrahieren?

The source code implementation is as follows.

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

import javax.sql.DataSource;

import oracle.jdbc.OracleTypes;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;

import org.apache.log4j.Logger;
import org.springframework.jdbc.core.SqlOutParameter;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.core.SqlTypeValue;
import org.springframework.jdbc.object.StoredProcedure;

public class RevPrdBrkDwnSP extends StoredProcedure{

    private final Logger log = Logger.getLogger(this.getClass().getName());

    public RevPrdBrkDwnSP(DataSource dataSource, String storeProcName) {

        // Run the Parent
        super(dataSource, storeProcName);

        // Declare the Parameter Details
        declareParameter(new SqlParameter("IN_ARRAY", OracleTypes.ARRAY, "****.PROD_PRCT_BRKDWN_TYPE_ARRAY"));
        declareParameter(new SqlOutParameter("OUT_ARRAY", OracleTypes.ARRAY, "****.PROD_PRCT_BRKDWN_TYPE_ARRAY"));

        // Compile the SP
        compile();
    }

    public boolean execute(final RevAppViewBean appViewBean$Session, final DataSource dataSource) throws Exception {
        boolean returnVal = false;
        Map<String, Object> inParams = new HashMap<String, Object>();
        log.info("Setting up the Store Procedure Params");

        inParams.put("IN_ARRAY", new SqlTypeValue() {
            public void setTypeValue(PreparedStatement cs, int index, int sqlType, String typeName) throws SQLException {
                Connection con = cs.getConnection();
                ArrayDescriptor des = ArrayDescriptor.createDescriptor("****.PROD_PRCT_BRKDWN_TYPE_ARRAY", con);
                ARRAY a = new ARRAY(des, con, appViewBean$Session.getExcelRecLst().toArray());
                cs.setObject(1, (Object)a);
            }
        });

        inParams.put("OUT_ARRAY", identifier); // what should the identifier be ?????????

        if (log.isDebugEnabled()) {
            log.debug("Executing the **** Store Procedure ");
        }

        Map out = super.execute(inParams); // how to get the same array as value ?????? 

        log.info("output size is --------------------->>>>>>>>>> "+out.size());
        for(Object o : out.keySet()){
            log.info((String)out.get(o));
            returnVal = Boolean.parseBoolean((String)out.get(o));
        }

        if (log.isDebugEnabled()) {
            log.info("Output from **** Store Procedure :" + out);
        }

        return returnVal;
    }
}

Aktualisieren: Nach der Verwendung der Spring Data JDBC-Erweiterung musste der Quellcode geändert werden, um die neue Antwort aufzunehmen, die unten eingefügt wird. Das Verbindungsproblem besteht jedoch weiterhin, wenn die bean.getAttributes () -Methode aufgerufen wird. Offenbar muss eine Möglichkeit gefunden werden, die Verbindung nicht zu schließen oder auf die Werte zuzugreifen, bevor die Verbindung geschlossen wird.

Map out = super.execute(inParams);
        log.info("output size is --------------------->>>>>>>>>> "+out.size()); //prints the actual value

        Object[] idOutArraz = (Object[])out.get("OUT_ARRAY");

        log.info("size of returnValue is "+idOutArraz.length); //prints the right number of results

        for(int i= 0; i<idOutArraz.length;i++){
            Object[] attrs = null;
            Struct bean = (Struct) idOutArraz[i];
            attrs = bean.getAttributes();
            if (attrs != null) {
                System.out.println(Arrays.asList(attrs));
            }
        } 

Antworten auf die Frage(2)

Ihre Antwort auf die Frage