2017-03-27 1 views
0

Ich habe eine gespeicherte Prozedur, den Körper hat wie: -Wie wird eine gespeicherte Prozedur mit Ref-Cursor als Ausgabeparameter mit Spring aufgerufen?

PROCEDURE PROC_NAME(param1 in varchar2,param2 in varchar2,results_cursor OUT CURSOR_TYPE);

Jede Reihe von Ergebnis entspricht eine Instanz einer bestimmten benutzerdefinierte Klasse.

Wie kann ich das im Frühjahr nennen. Ich habe viel google und stackoverflow durchgelaufen, konnte aber keine passende Antwort finden.

Kann mir bitte jemand eine Lösung für dieses Problem. Danke im Voraus.

+0

Ich bin nicht sicher, wie es mit JdbcTemplate zu tun, aber ich habe es mit Klar JDBC getan. Ich kann Code schreiben, wenn Sie JDBC verwenden können. –

+0

@dsp_user: Ich kann JDBC nicht in meinem Code verwenden. –

+0

Nun, JDBCTemplate verwendet es bereits intern, aber es liegt wirklich an Ihnen. –

Antwort

1

Hier ist etwas, das ich zusammen basierend auf this StackOverflow question und the Spring documentation:

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 Ihre gespeicherte Prozedur in einem anderen Schema oder in einem Paket ist, müssen Sie den Namen der gespeicherten Prozedur in der oben anzupassen. Außerdem müssen Sie einen Zeilenmapper angeben, der anstelle von SomeRowMapper verwendet wird.

es 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 eine SimpleJdbcCall verwenden können:

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 die gespeicherte Prozedur in einem Paket ist, müssen Sie eine Zeile hinzufügen

  .withCatalogName("PACKAGE_NAME") 

zum Setup von jdbcCall. Und falls es in einem anderen Schema ist, müssen Sie hinzufügen

  .withSchemaName("SCHEMA_NAME") 
Verwandte Themen