basic loop
_____________________________________________________________________
accept p_telecom prompt '통신사 입력 : '
declare
v_telecom varchar2(10):=lower('&p_telecom');
cursor emp17_cursor IS
select ename, age, telecom
from emp17
where telecom=v_telecom;
emp17_record emp17_cursor%rowtype;
e_invalid exception;
Begin
open emp17_cursor;
loop
fetch emp17_cursor into emp17_record;
if emp17_cursor%NOTFOUND and emp17_cursor%rowcount=0 THEN
raise e_invalid;
end if;
exit when emp17_cursor%notfound;
dbms_output.put_line(emp17_record.ename||chr(9)||emp17_record.age||chr(9)||emp17_record.telecom);
end loop;
close emp17_cursor;
EXCEPTION
when e_invalid THEN
dbms_output.put_line('통신사가 없습니다.');
End;
/
for loop
_____________________________________________________________________
set verify off
set serveroutput on
accept p_telecom prompt '통신사를 입력하세요 '
declare
v_telecom emp17.telecom%type := '&p_telecom';
v_cnt number(10);
e_invalid exception;
begin
select count(*) into v_cnt
from emp17
where telecom=v_telecom;
if v_cnt=0 then
raise e_invalid;
end if;
for emp17_record in ( select ename, age, telecom
from emp17
where telecom= v_telecom ) loop
dbms_output.put_line( emp17_record.ename || chr(9) || emp17_record.age
|| chr(9) || emp17_record.telecom );
end loop;
exception
when e_invalid then
dbms_output.put_line('해당 통신사는 없습니다.');
end;
/
첫댓글 만약 통신사에 이상한 값을 넣고 실행한다면. for문 안에 있는 코드는 실행되지 않는다.
for문안에 in절 select문에 값이 없다면 for문이 암시적으로 종료한다.
그래서 보통 for loop에서 사용자 정의 예외를 할려면 for문밖에서 조치( 예 : count(*) )를 취해야 한다.