JDBC practice_240306

Choi Suyeon·2024년 3월 6일

CallableStatement

Procedure를 호출하기 위해 사용하는 객체
PreparedStatement의 자식 인터페이스

Procedure

PL(Procedural Language) / SQL 중 하나.
DBMS에서 정보관리 뿐만 아니라 업무로직을 정의할 수 있다.
화면이 다양하게 제공되는 환경에서 유리.(업무로직을 집중해서 구현할 수 있다.)
-코드작성, 컴파일, 바인드변수의 선언, 직접실행의 순서를 가진다.
-작성된 Procedure는 user_procedures DD에서 확인 가능.
-함수와는 다르게 업무로직과 쿼리문을 함께 가진다.
-autocommit이 되지 않고, 개발자가 직접 commit을 해야한다.
-반환형이 없고 매개변수가 반환 값을 저장한다.(여러 개의 값이 반환된다.)
-업무의 연속성을 가질 수 있다.(프로그램 실행 도중 다른 결과를 얻을 수 있다.)

* 주의 사항 : 문장의 끝에는 ;을 넣는다.

create or replace procedure 프로시저명( 매개변수 타입 데이터형,,,)
is								//in parameter : 생략하면 기본 설정.
  변수선언                       //-프로시저외부의 값을 내부로 전달할 때 사용.
begin                           //out parameter : 프로시저 내부의 값을 외부로 전달.
	업무로직 구현
end;
/ <= * /로 끝나야 함. *

순서

1. 프로시저 작성
create or replace procedure test_proc()
is

begin
	dbms_output.put_line("hello"); 또는 dbms_output.put_line(||’붙일 값’);

end;
/  <= 빼먹지 말것!

2. 저장
파일명.sql

3. 컴파일
@경로명/파일명.sql

4. 에러보기
show error

5. 바인드 변수 선언 - 프로시저가 실행한 결과를 저장하기 위해
var(variable) 변수명 데이터형(크기)

6. 실행기를 사용한 선언
exec (execute) 프로시저명(,,,:바인드변수명,,,,)

7. 바인드변수에 설정된 값 출력
print 바인드변수명 바인드변수명

CallableStatement를 사용한 Procedure 실행

  1. CallableStatement 얻기
    CallableStatement cstmt = con.preparedCall("{ call 프로시저명(?,?,,)}");

  2. 바인드변수에 값 설정
    in parameter(외부의 값을 Procedure내부로 전달하기 위한 변수)
    cstmt.set

    out parameter(Procedure 내부의 값을 Procedure외부로 전달하기 위한 변수)
    -Java에서는 Out parameter를 등록하여 사용한다.(Oracle에서는 var로 선언하는 bind변수)

    cstmt.registerOutParameter(인덱스, 데이터형)

  3. 프로시저를 실행(method가 없음 => 부모의 method를 사용)
    cstmt.execute();

  4. out parameter에 저장된 값 받기(SYS_REFCURSOR가 아닌 이상 ResultSet을 사용하지 않는다.)
    cstmt.getInt(인덱스);
    cstmt.getString(인덱스);
    cstmt.getObject(인덱스);

java.sql.Types

DBMS에서 사용되는 데이터 형을 자바에서 지원하는 클래스
특정 DBMS만 사용하는 데이터 형을 지원하지 않고, 공통적인 이름의 데이터 형을 지원한다.

특정 DBMS에서만 지원하는 데이터 형을 사용하고 싶다면, DB Vendor사에서 제공하는 Types클래스를 사용.
-CallableStatement에서는 out parameter의 값을 저장하기 위해
registerOutparameter method의 매개변수로 사용.

* 선언
create or replace procedure test(num out number, name out varchar2)
is

* java 호출
CallableStatement cstmt = con.prepareCall("{call test(?,?)}");

-number 호출(Types에는 number가 없으므로 NUMERIC사용)
cstmt.registerOutParameter(1, Types.NUMERIC);

-varchar2 호출(Types에는 VARCHAR2가 없으므로 VARCHAR를 사용)
cstmt.registerOutParameter(2, Types.VARCHAR);

-프로시저 실행
cstmt.execute();

PL/SQL에서 if문

* if 조건식 then

end if;


* if 조건식 then

else

end if;


* if 조건식 then <= 연관된 여러 조건을 비교할 때

elsif 조건식 then

elsif 조건식 then

else

end if;

0개의 댓글