cursor 사용(SYS_REFCURSOR 사용 - 커서의 제어권을 넘겨주는 커서)
//조회결과를 procedure 외부에서 조회할 수 있도록 전달하는 커서
// cursor :
* 암시적 커서(sql)
- insert, update, delete의 수행 행수를 반환하는 커서.
-개발자가 커서를 선언하지 않고, 쿼리문이 실행되면 자동생성되는 커서, 커서명 SQL이고,
속성은 %ROWCOUNT만 존재 => SQL%ROWCOUNT
* 명시적 커서
- 여러 행을 조회할 때 사용하는 커서.(PL/SQL에서는 select문으로 한 행만 조회가능하다.)
-개발자가 커서를 선언하고 사용하는 커서.
-프로시저안에서 여러 행을 조회하는 커서와 제어권을 반환하는 커서 두가지를 제공.
//여러 행을 조회하는 커서 : 선언법) cursor 커서명 is select...
//제어권을 반환하는 커서 : SYS_REFCURSOR데이터 형을 사용하여 저장하고, Java에서는 ResultSet을 사용하여 저장한다.
-Mapper.xml
HashMap 필요
1. hashmap 정의
(MyBatis Framework에서 java.util.HashMap 클래스를 hashmap이라는 객체로 제공)
<resultMap id="id" type="hashmap"/>
<select id="id" statementType="CALLABLE">
{call 프로시저명(#{map키, mode=IN, jdbcType=java.sql.Types},
#{map키, mode=OUT, jdbcType=java.sql.ResultSet, resultMap = resultMap 아이디}
)}
<select/>
-MyBatis Handler
1. Procedure에 전달할 값과 Procedure에서 처리한 결과를 저장할 Map생성.
Map<String, Object> map = new HashMap<String, Object>();
Procedure에서 사용할 in parameter값을 설정
map.put("map키", 값);
Procedure 호출
ss.selectOne("아이디", map);
조회결과를 받는다.
List<Map<String, Object>> data = map.get("키");
//String(컬럼명),
Object(조회값
숫자 => java.math.BigDecimal클래스에 값이 저장되어 반환)
문자열 => String 사용하여 저장
날짜 => java.sql.Timestamp 클래스에 값이 저장되어 반환
procedure 생성
create or replace procedure select_dept_emp(i_deptno number, cur_emp out sys_refcursor, err_msg out varchar2)
procedure 호출 (Mapper.xml)
2-1. resultMap 선언 : 조회된 결과를 저장하여 반환하기 위한 Map
<resultMap id="map" type="hashmap"/>
2-2. procedure 호출
<select id="selectDeptEmp" statementType="CALLABLE">
{ call select_dept_emp(#{deptno, mode=IN, jdbcType=NUMERIC},
#{selectEmp, mode=OUT, jdbcType=CURSOR, javaType=java.sql.ResultSet, resultMap=map},
#{msg, mode=OUT, jdbcType=VARCHAR, resultMap=map})}
<select/>
3-2. Map에 값 설정.
map.put("deptno", 10);
3-3. 실행
ss.selectOne("selectDeptEmp", map);
3-4. map에 저장된 결과 얻기
List<Map<String, Object>> list = (List<Map<String, Object>>)map.get("selectEmp");
3-5. View에서 출력을 하기 위해서 List에 추가
List<xxxDomain> resultlist = new ArrayList<xxxDomain>();
xxxDomain xd = null;
for(Map<String, Object> map :list){
xd = new xxxDomain();
xd.setter(searchMap.get("컬럼명"));
searchMap.get("컬럼명")
컬럼명
숫자 => BigDecimal
xd.setter( ((BigDeciml)searchMap.get("SAL")).intValue() ;
문자열 => String
xd.setter( ((String)searchMap.get("ENAME")) );
날짜 => Timestamp
xd.setter( new Date( ((Timestamp)searchMap.get("HIREDATE")).getTime() ) );
}