개발

CallableStatement로 Stored Procedure 사용하기

Domaya 2023. 9. 19. 21:37

 

개발서버 테스트 중 프로시저 에러가 나서 뜯어봤다

기존엔 이벤트스케줄러에서 바로 프로시저를 호출하는 방법으로밖에 써보지 않아서

자바단에서 sp를 사용하는 코드를 처음 봄 기념으로 정리해본다

 

CallableStatement란?

SQL의 스토어드 프로시저(Stored Procedure)를 실행시키기 위해 사용되는 인터페이스.

스토어도 프로시저란, query문을 하나의 파일 형태로 만들거나 데이터베이스에 저장해놓고 함수처럼 호출해서 사용하는 것이다. 이를 자바에서 사용하면 자바코드에 query문이 들어가지 않으므로 자바 코드가 간결해지고 sql에 독립적이 된다.

 

스토어드 프로시저를 자바에서 사용하려면, execute를 호출하기에 앞서 registerOutParameter()를 호출해야 한다

sp의 특이한 점은 파라미터로 return값을 할당할 변수도 넣어줘야한다는 점인듯

 

 

registerOutParameter(int parameterIndex, int sqlType) throws SQLException

위 메소드는 프로시저로 받아온 값을 JDBC타입으로 등록하는 메소드로, 모든 리턴값은 이 과정을 거쳐야 한다.

 

예제코드

 

ProcedureDAO.java


CallableStatement Cs = null;
TestVO vo = service.getTestVo();

Try{

Cs = con.callStatement(“{call PR_TEST(?,?,?,?,?,?,?)}”);
Int i = 1;
Cs.setString(i++, vo.getDocId());
Cs.setString(i++, vo.getRegUserNm());
Cs.registerOutParameter(i++, java.sql.Types.VARCHAR);
Cs.registerOutParameter(i++, java.sql.Types.VARCHAR);
Cs.registerOutParameter(i++, java.sql.Types.INTEGER);
Cs.registerOutPutParameter(i++, java.sql.Types.INTEGER);
Cs.registerOutParameter(i++, java.sql.Types.VARCHAR);
Cs.execute();
} catch(Exception e){
//TODO
}
 

폰으로 썼더니 대문자가 된 변수

암튼

Cs.execute()를 실행하기 전에 파라미터를 셋팅해주는 과정을 보면

두번째줄까지는 input 파라미터이고,

그 아래 다섯개는 프로시저에서 리턴되는 결과를 담기 위한 변수의 타입을 지정해주는 느낌인듯하다

 

DECLARE
  A VARCHAR2(12);
  B VARCHAR2(12);
  C NUMBER(4);
  D NUMBER(4);
  E VARCHAR2(12);
BEGIN
 PR_TEST('202309190931', 'TESTER');
END;
 

sql로 스토어드프로시저를 실행하는 쿼리