게시일: Nov 21, 2011 10:54:19 PM
- GOTO 문
: 특정한 곳으로 분기하는데 사용
declare
iNumber integer;
iTempNum integer;
begin
iTempNum := 1;
iNumber := 0;
goto second;
<<first>>
dbms_output.put_line('first');
for iTempNum in 1..10 loop
iNumber := iTempNum * 2;
dbms_output.put_line(iNumber);
end loop;
<<second>>
dbms_output.put_line('second');
iNumber := 0;
for iTempNum in reverse 1..10 loop
iNumber := iTempNum * 2;
dbms_output.put_line(iNumber);
end loop;
end;
- NULL 문
: 아무것도 수행하지 않는다.
: 보통 예외처리시 자주 사용된다.
declare
sFlag varchar2(1) := null;
begin
select case flag when '1' then 'A'
when '2' then 'B'
when '3' then 'C'
else null
end case
into sFlag
from (select '1' flag from dual);
end;
- 커서
: 쿼리에 의해 반환되는 결과는 메모리 상에 위치하게 되는데 PL/SQL에서는 바로 커서(cursor)를 사용하여 이 결과집합에 접근할 수 있다.
① 명시적 커서
▶ 커서 선언 : 커서에 이름을 주고, 이 커서가 접근하려는 쿼리를 정의한다.
CURSOR 커서명 IS
SELECT 문장;
▶ 커서 열기 : 커서로 정의된 쿼리를 실행하는 역할을 한다.
OPEN 커서명;
▶ 패치 : 쿼리의 결과에 접근한다. 보통 쿼리는 한 개 이상의 결과를 반환하므로 루프를 돌며 개별 값들에 접근해서 임의의 처리를 하게 된다.
FETCH 커서명 INTO 변수들;
▶ 커서 닫기 : 사용된 커서를 닫는다. 닫는다는 의미는 커서 처리를 끝내고 메모리상에 존재하는 쿼리의 결과를 소멸시키게 된다.
CLOSE 커서명;
declare
cursor cur1 is
select flag
from (select '1' flag from dual union all
select '2' flag from dual union all
select '3' flag from dual union all
select '4' flag from dual );
sFlag varchar2(1) := null;
begin
open cur1;
loop
fetch cur1 into sFlag;
exit when cur1%NOTFOUND; -- %NOTFOUND 속성은 커서에서만 사용 가능
-- 더 이상 패치할 로우가 없음을 의미하며 따라서 쿼리의 마지막 결과까지 패치한 후에 자동으로 로프를 빠져나가게 된다.
dbms_output.put_line(sFlag);
end loop;
close cur1;
end;
☞ 커서에서만 사용 가능한 속성
%FOUND : 커서가 막 오픈된 상태에서는 null 값을 반환. 오픈되고 첫 번째 패치가 발생한 이후부터는 TRUE 값을 반환하여 더 이상 패치할 로우가 없을 경우 FALSE 반환
%ISOPEN : 커서가 오픈된 상태일 경우 TRUE 값을 반환
%NOTFOUND : %FOUND의 반대 개념
%ROWCOUNT : counter 역할. 커서가 막 오픈되었을 때는 0, 패치될 때마다 1씩 증가
② 묵시적 커서 (implict cursor)
: 오라클 내부 커서, 모든 쿼리사 실행될 때마다 오픈됨.
: 항상 가장 최근에 실행된 SQL 문장에 대한 커서를 내부적으로 갖고 있는데 이를SQL 커서라 하며 'SQL' 이라는 이름으로 속성에 접근할 수 있다.
declare
count1 number;
count2 number;
begin
select count(*)
into count1
from (select '1' flag from dual union all
select '2' flag from dual union all
select '3' flag from dual union all
select '4' flag from dual );
count2 := SQL%ROWCOUNT;
dbms_output.put_line('SELECT COUNT is ' || count1); -- 4
dbms_output.put_line('ROW COUNT is ' || count2); -- 1
end;