PL/SQL에서 insert, update, delete는 그대로 사용할 수 있으나, select은 into절이 사용된다.
cursor를 사용하지 않은 select은 한 행만 조회되어야 한다.
select 컬럼명,,,
into 변수명,,, <= 조회된 컬럼값을 저장할 변수들,,,
from 테이블명 //( 조회컬럼과 into절의 변수의 수가 맞지 않으면 error)
where 조건
쿼리문이 실행된 행을 얻거나, 여러 행을 조회할 때 사용하는 객체
암시적 커서 : 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외부로 내보낼 수 있다.
create or replace procedure 프로시저명(변수명 out sys_refcursor)
is
begin
open 커서명 for select ,,,; --쿼리실행결과를 procedure외부에서 사용하기 때문에
end; --procedure내부에서는 생명주기에 대한 코딩을 하지 않는다.
/
* 호출
1. 바인드 변수 선언
var 커서명 refcursor
2. 프로시저 호출
exec 프로시저명(:커서명)
3. 출력
print 커서명
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.