일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- I/O장치
- 스케줄링
- DirectX 12
- codility
- OS
- 영속성
- 다이나믹 프로그래밍
- 그리디알고리즘
- 컨디션 변수
- 멀티프로세서
- 백준
- 멀티쓰레드
- 그리디 알고리즘
- 병행성
- 프로그래머스
- 자료구조
- 운영체제
- 파일시스템 구현
- 타입 객체
- 알고리즘
- 동적계획법
- 다이나믹프로그래밍
- 락
- directx
- DirectX12
- 쓰레드
- 디자인패턴
- 병행성 관련 오류
- 렌더링 파이프라인
- Direct12
- Today
- Total
기록공간
CallableStatement 본문
CallableStatement ?
CallableStatement 인터페이스는 모든 DBMS에 대한 표준 방법으로 저장 프로시저(stored procedure)를 호출하는 방법을 제공하는 인터페이스이며, 호출은 두 가지 형태 중 하나인 escape 문법으로 작성되어진다.
결과 매개변수를 가지는 형태와 결과 매개변수가 없는 형태 두 가지로 나뉘며 OUT 매개변수의 종류인 결과 매개변수는 저장 프로시저에 대한 리턴값이다. 두 형태 모두 IN 매개변수(입력), OUT 매개변수(출력), INOUT 매개변수(입출력)를 위해 사용되어지는 매개변수의 변수 번호를 가지며 『 ? 』 는 매개변수의 저장 위치로 나타낸다.
형식 및 구조
CallableStatement를 활용하여 JDBC에서 저장 프로시저를 호출하는 문법은 다음과 같다.
- 매개변수가 없는 저장 프로시저 호출
{call procedure_name}
- IN 매개변수를 리턴하는 프로시저 호출
{call procedure_name[ ( ?, ?, ... ) ]}
- OUT 매개변수를 리턴하는 프로시저 호출
{? = call procedure_name[ ( ?, ?, ... ) ]}
CallableStatement 객체 생성
CallableStatement 객체는 Connection의 『 prepareCall() 』 메소드에 의해 생성된다.
예를 들어 두 개의 인자값을 가지고 있으며 결과 매개변수가 없는 저장 프로시저 procData를 호출하는 방법은 다음과 같다.
CallableStatement cstmt = conn.preparedCall(" {call procData( ?, ? )}");
// 물음표(『 ? 』)의 위치가 IN, OUT, INOUT 매개변수 중 어떤 것인가 하는 것은
// 저장 프로시저 procData에 의존한다.
IN, OUT 매개변수
CallableStatement 객체로 IN 매개변수를 넘겨주는 것은 PreparedStatement로 부터 상속받은 『 setXxx() 』 메소드이다. 예를 들면, setFloat() 메소드는 float 값을 넘겨주게 되는 것이다.
만약, 저장 프로시저가 OUT 매개변수를 리턴한다면 각 OUT 매개변수의 SQL형(Type)은 CallableStatement 객체를 실행할 수 있는 상태가 되기 전에 등록되어져야 한다. 이는 몇몇 DBMS들이 SQL 형(Type)을 필요로 하기 때문이다. 이 때, SQL 형(Type)을 등록하는 것은 『 registerOutParameter() 』 메소드를 사용하게 된다.
그리고, SQL 구문이 실행된 다음에 CallableStatement의 『 getXxx() 』메소드는 매개변수의 값을 검색하며, 사용되는 『 getXxx() 』메소드는 그 매개변수를 위해 등록되어진 SQL에 상승하는 자바 형(Type)이다. 즉, 『 registerOutParameter() 』 메소드는 SQL 타입을 사용하고 『 getXxx() 』 메소드는 이것을 자바 타입으로 형변황(cast) 하는 것이다.
예를 들어 다음과 같이 커서를 반환하는 프로시저가 있다고 가정하자.
CREATE OR REPLACE PROCEDURE PRC_MEMBERSELECT
(
VRESULT OUT SYS_REFCURSOR
)
IS
BEGIN
OPEN VRESULT FOR
SELECT SID, NAME, TEL
FROM TBL_MEMBER
ORDER BY SID;
--CLOSE VRESULT; --> 외부로부터 커서를 받아올때는 커서를 닫으면 안된다.
END;
이 프로시저를 실행하고 그 커서 값을 Java로 받아오기 위해서는 다음과 같은 코드가 필요하다.
String sql = "{call PRC_MEMBERSELECT(?)}";
CallableStatement cstmt = conn.prepareCall(sql);
// 프로시저 내부에서 sys_refcursor 를 사용하고 있기 때문에
// OracleTypes.CURSOR 를 사용하여야 한다.
cstmt.registerOutParameter(1, OracleTypes.CURSOR);
cstmt.execute();
// Object 형을 ResultSet으로 형변환
ResultSet rs = (ResultSet)cstmt.getObject(1);
while(rs.next())
{
String sid = rs.getString("SID");
String name = rs.getString("NAME");
String tel = rs.getString("TEL");
String str = String.format("%3s %7s %10s", sid, name, tel);
System.out.println(str);
}
rs.close();
cstmt.close();
'DataBase > JDBC' 카테고리의 다른 글
PreparedStatement (0) | 2020.11.08 |
---|---|
DAO, DTO 그리고 Process (0) | 2020.11.07 |
JDBC 프로그래밍 절차 및 구현 (0) | 2020.10.31 |
JDBC 개념정리 (0) | 2020.10.31 |