2017-03-27 7 views
0

난 형체를 갖는 프로 시저가있다.Spring을 사용하여 참조 커서로 출력 매개 변수로 저장 프로 시저를 호출하는 방법은 무엇입니까?</p> <p><code>PROCEDURE PROC_NAME(param1 in varchar2,param2 in varchar2,results_cursor OUT CURSOR_TYPE);</code></p> <p>결과의 각 행은 특정 사용자 정의 된 클래스의 인스턴스에 해당 - :

스프링에서 어떻게 호출 할 수 있습니까? 나는 많은 google과 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")