Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie rufe ich eine gespeicherte Prozedur mit Ref-Cursor als Ausgabeparameter mit Spring auf?

Hier ist etwas, das ich basierend auf diese StackOverflow-Frage und die Spring-Dokumentation :

import java.sql.Types;
import java.util.HashMap;
import java.util.Map;

import javax.sql.DataSource;

import oracle.jdbc.OracleTypes;
import org.springframework.jdbc.core.SqlOutParameter;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.object.StoredProcedure;

public class SampleStoredProcedure extends StoredProcedure {

    public SampleStoredProcedure(DataSource dataSource) {
        super(dataSource, "PROC_NAME");
        declareParameter(new SqlParameter("param1", Types.VARCHAR));
        declareParameter(new SqlParameter("param2", Types.VARCHAR));
        declareParameter(new SqlOutParameter("results_cursor", OracleTypes.CURSOR, new SomeRowMapper()));
        compile();
    }

    public Map<String, Object> execute(String param1, String param2) {
        Map<String, Object> inParams = new HashMap<>();
        inParams.put("param1", param1);
        inParams.put("param2", param2);
        Map output = execute(inParams);
        return output;
    }
}

Wenn sich Ihre gespeicherte Prozedur in einem anderen Schema oder in einem Paket befindet, müssen Sie den Namen der gespeicherten Prozedur oben anpassen. Außerdem müssen Sie einen Zeilenzuordner angeben, der anstelle von SomeRowMapper verwendet werden soll .

Um es zu nennen:

    DataSource dataSource = ... ; // get this from somewhere
    SampleStoredProcedure sp = new SampleStoredProcedure(dataSource);
    Map<String, Object> result = sp.execute("some string", "some other string");
    // Do something with 'result': in particular, result.get("results_cursor")
    // will be the list of objects returned

Alternativ können Sie einen SimpleJdbcCall verwenden :

    DataSource dataSource = ... ; // get this from somewhere
    SimpleJdbcCall jdbcCall = new SimpleJdbcCall(dataSource);
    Map<String, Object> result =
        jdbcCall.withProcedureName("PROC_NAME")
            .declareParameters(
                    new SqlParameter("param1", Types.VARCHAR),
                    new SqlParameter("param2", Types.VARCHAR),
                    new SqlOutParameter("results_cursor", OracleTypes.CURSOR, new SomeRowMapper()))
            .execute("some string", "some other string");

Wenn sich die gespeicherte Prozedur in einem Paket befindet, müssen Sie eine Zeile hinzufügen

            .withCatalogName("PACKAGE_NAME")

zum Setup von jdbcCall . Wenn es sich in einem anderen Schema befindet, müssen Sie entsprechend hinzufügen

            .withSchemaName("SCHEMA_NAME")