2017-03-27 151 views
0

我有一個存儲過程,其具有體,如: -如何使用Spring將ref cursor作爲輸出參數調用存儲過程?

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

結果中的每個行是等同於某一用戶定義的類的實例。

如何在Spring中調用此方法。我經歷了很多谷歌和stackoverflow,但無法找到一個合適的答案。

任何人都可以請給我一個解決方案。提前致謝。

+0

我不知道如何使用JdbcTemplate完成此操作,但我使用普通JDBC完成了此操作。如果您可以使用JDBC,我可以發佈一些代碼。 –

+0

@dsp_user:我無法在我的代碼中使用JDBC。 –

+0

那麼,JDBCTemplate已經在內部使用它,但這真的取決於你。 –

回答

1

這裏的東西我放在一起基於this StackOverflow questionthe 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; 
    } 
} 

如果你的存儲過程是另一種模式或在包中,你需要在上述調整存儲過程的名稱。此外,您需要指定一個行映射器來代替SomeRowMapper。另外

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 

,你可以使用一個SimpleJdbcCall

要叫它

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"); 

如果存儲過程是在一個包,你需要添加一行

  .withCatalogName("PACKAGE_NAME") 

到設置jdbcCall。同樣,如果它在不同的架構中,則需要添加

  .withSchemaName("SCHEMA_NAME") 
相關問題