2014-07-16 2 views
0

배열을 입력 매개 변수로 사용하는 SQL Server 2008의 저장 프로 시저가 있습니다. http://www.sommarskog.se/arrays-in-sql-2008.html에 따르면 TVP를 사용합니다. 그러나 이것은 MSSQL JDBC 드라이버에서 지원되지 않습니다. 따라서 배열 매개 변수를 전달할 수 없기 때문에 SimpleJdbcCall을 사용하여 저장 프로 시저를 실행할 수 없습니다. 나는이 절차를 아래와 같이 전화의 JdbcTemplate을 사용하여 다시 설정 :SQL Server : jdbctemplate을 사용하여 여러 결과 집합을 반환하는 저장 프로 시저에 배열을 전달하는 방법

StringBuilder sb = new StringBuilder(); 
sb.append("declare @d object_url_type;"); 
sb.append("insert into @d values (0, 'http://example.com', '/index.html', '');"); 
sb.append("insert into @d values (0, 'http://example.com', '/help.html', '');"); 
sb.append("exec procedure_name @[email protected], @id=123"); 
jdbcTemplate.query(sb.toString(), new BeanPropertyRowMapper(ObjectData.class)); 

내가 가진 문제는 저장 프로 시저가 두 개의 결과 집합을 반환합니다. 하지만 jdbcTemplate을 사용하여 첫 번째 결과 집합 만 검색 할 수있는 것처럼 보입니다. SimpleJdbcCall을 사용할 수 있다면 두 개의 결과 집합을 쉽게 구분할 수 있지만 불행히도 사용할 수는 없습니다. 나는 많이 봤지만이 문제에 대한 해결책을 찾을 수 없습니다. 누구 pls이 날 도와 드릴까요? 나는 원시 JDBC 방식을 사용하기 위해 돌아갈 것이라고 생각한다.

답변

1

대신 JdbcTemplate을의 봄의 StoredProcedure 클래스를 사용해야 한 다음 사용하여 여러 결과 집합을 반환 할 수 있습니다 될 declareParameter :

package com.example; 

import java.util.List; 
import java.util.Map; 

import org.junit.Test; 
import org.springframework.beans.factory.annotation.Autowired; 

public class ExampleStoredProcedureTest { 
    // assuming you pass the dataSource in via injection, etc, etc. 
    @Autowired 
    public ExampleStoredProcedure storedProc; 

    @Test 
    public void test() { 
     Map<String, Object> results = storedProc.execute("Test Parameter"); 

     // accessing the result sets 
     List<?> rs1 = (List<?>) results.get(ExampleStoredProcedure.RESULTSET1); 
     List<?> rs2 = (List<?>) results.get(ExampleStoredProcedure.RESULTSET2); 

     // etc 
    } 

} 
:

package com.example; 

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

import javax.sql.DataSource; 

import org.springframework.jdbc.core.RowMapper; 
import org.springframework.jdbc.core.SqlParameter; 
import org.springframework.jdbc.core.SqlReturnResultSet; 
import org.springframework.jdbc.object.StoredProcedure; 

public class ExampleStoredProcedure extends StoredProcedure { 

    public class MyOtherRowMapper implements RowMapper<Long> { 

     @Override 
     public Long mapRow(ResultSet rs, int rowNum) throws SQLException { 
      return rs.getLong("LONGCOLUMNNAME"); 
     } 

    } 

    public class MyRowMapper implements RowMapper<String> { 

     @Override 
     public String mapRow(ResultSet rs, int rowNum) throws SQLException { 
      return rs.getString("STRINGCOLUMNMNAME"); 
     } 

    } 

    private static final String INPUT_PARAM = "@strParam"; 
    public static final String RESULTSET1 = "ResultSet1"; 
    public static final String RESULTSET2 = "ResultSet2"; 

    public ExampleStoredProcedure(DataSource dataSource, String storedProcName) { 
     super(dataSource, storedProcName); 
     this.declareParameters(); 
     compile(); 
    } 

    public Map<String, Object> execute(String param) { 
     Map<String, Object> inputs = new HashMap<String, Object>(); 

     inputs.put(INPUT_PARAM, param); 
     Map<String, Object> results = super.execute(inputs); 

     return results; 
    } 

    protected void declareParameters() { 
     declareParameter(new SqlParameter(INPUT_PARAM, Types.VARCHAR)); 
     declareParameter(new SqlReturnResultSet(RESULTSET1, new MyRowMapper())); 
     declareParameter(new SqlReturnResultSet(RESULTSET2, new MyOtherRowMapper())); 
    } 

} 

가 저장 프로 시저를 호출

관련 문제