PL/SQL에서 쿼리문 실행

PL/SQL에서 insert, update, delete는 그대로 사용할 수 있으나, select은 into절이 사용된다.
cursor를 사용하지 않은 select은 한 행만 조회되어야 한다.

select 컬럼명,,,
into   변수명,,, <= 조회된 컬럼값을 저장할 변수들,,,
from   테이블명			       //( 조회컬럼과 into절의 변수의 수가 맞지 않으면 error)
where  조건

CURSOR

쿼리문이 실행된 행을 얻거나, 여러 행을 조회할 때 사용하는 객체

  • 암시적 커서 : insert, update, delete문이 실행되면 실행된 행의 수를 얻을 수 있는 커서
    커서명은 sql로 설정되어있으며 %rowcount속성으로 실행된 행의 수를 얻을 수 있다.
    사용) sql%rowcount cnt := sql%rowcount

  • 명시적 커서 : 개발자가 선언하여 사용하는 커서
    -PL/SQL에서 여러 행을 조회할 때 사용하는 객체
    -생명주기를 가진다.(선언->열기->인출->닫기)
    -into절이 필요없다.
    -Out parameter로 커서를 내보낼 때에는 SYS_REFCURSOR를 사용한다.

조회

PL/SQL에서는 여러행을 조회하기 위해 명시적 커서를 사용.
SYS_REFCURSOR를 out parameter의 데이터형으로 사용하면 조회는 procedure안에서 수행하고, 조회결과를 Procedure외부로 내보낼 수 있다.

  • 순서
    프로시저 실행 -> 1.REFCURSOR로 제어권을 받은 다음 -> 3. print커서명을 사용하면 조회된 결과를 출력할 수 있다.
create or replace procedure 프로시저명(변수명 out sys_refcursor)
is

begin
		open 커서명 for select ,,,; --쿼리실행결과를 procedure외부에서 사용하기 때문에
end;				         --procedure내부에서는 생명주기에 대한 코딩을 하지 않는다.						
/

* 호출
1. 바인드 변수 선언
var 커서명 refcursor
2. 프로시저 호출
exec 프로시저명(:커서명)
3. 출력
print 커서명

CallableStatement로 sys_refcursor받기

Types.REF_CURSOR 필드를 사용하거나, OracleTypes.CURSOR를 사용하여 Prodcedure의 REF_CURSOR을 받을 수 있다.

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

* bind 변수에 값 설정
cstmt.registerOutParameter(인덱스, Types.REF_CURSOR);

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

* out parameter 값 받기
ResultSet rs = (ResultSet)cstmt.getObject
1. 프로시저 선언
create or replace procedure select_all_proc(cur out sys_refcursor)
is

begin
open cur for select,,,,;
end;
/
1. CallableStatement 얻기
CallableStatement cstmt = con.prepareCall("{ call select_all_proc(?)}");

2. 바인드 변수 설정
-in parameter
-out parameter
cstmt.registerOutParameter(1, Types.REF_CURSOR);

3. 실행
cstmt.execute();

4. out parameter에 할당된 값 얻기
ResultSet rs = cstmt.

0개의 댓글