5. PL/SQL 제어구조 작성


 


A. IF Statement


§Syntax

IF condition THEN


statements;


[ELSIF condition THEN


statements;]


[ELSE


statements;]


END IF;


ex)


1) 간단한 IF 문


DECLARE


v_myage number := 30;


BEGIN


IF v_myage < 11


THEN


DBMS_OUTPUT.PUT_LINE(‘ I am a child ‘);


END IF;


END;


/


2) if then else 문


declare


v_myage number := &myage;


begin


if v_myage < 20 then


dbms_output.put_line(‘ I am young ‘);


elsif v_myage < 30 then


dbms_output.put_line(‘ I am in my twenties ’);


elsif v_myage < 40 then


dbms_output.put_line(‘ I am in my thirties ’);


else


dbms_output.put_line(‘ I am always young ‘);


end if;


end;


/




 


B. IF 문의 NULL 값


declare


v_myage number;


begin


if v_myage < 11 then


dbms_output.put_line(‘ I am a child ‘);


else


dbms_output.put_line(‘ I am not a child ‘);


end if;


end;


/



– v_myage 변수가 초기화 되지 않았기 때문에 null 값을 반환하여 else 문으로 이동


 


C. CASE 식


§Syntax

CASE selector


WHEN expression1 THEN result1


WHEN expression2 THEN result2


….


WHEN expressionN THEN resultN


[ELSE resultN+1]


END;


 


ex) 두가지 방식의 사용법


1) v_grade 값을 표현식으로 사용


declare


v_grade char(1) := upper(‘&grade’);


v_appraisal varchar2(20) ;


begin


v_appraisal := case v_grade


when ‘A’ then ‘Excellent’


when ‘B’ then ‘Good’


when ‘C’ then ‘Loser!!’


else ‘No such grade’


end;


dbms_output.put_line (‘Grade: ‘ || v_grade || ‘ Appraisal ‘ || v_appraisal);


end;


/



 


2) when 절에 부울 값을 생성하는 표현식이 포함


declare


v_grade char(1) := upper(‘&grade’);


v_appraisal varchar2(20);


begin


v_apprasial := case


when v_grade = ‘A’ then ‘Excellent’


when v_grade in(‘B’, ’C’) then ‘Good’


else ‘No such grade’


end;


dbms_output.put_line (‘Grade: ‘ || v_grade || ‘Appraisal ‘ || v_appraisal);


end;


/



 


D. CASE 식과 CASE 문



§CASE 식은 조건을 평가하여 값을 반환하는 반면에

  CASE 문은 조건을 평가하여 작업을 수행


§CASE 식은 END; 로 종료

§CASE 문은 END CASE; 로 종료


– CASE 문 예제


 

E. NULL 처리

 


§NULL 을 사용하는 단순 비교는 항상 NULL 을 반환


§논리연산자 NOTNULL 에 적용하면 NULL 이 발생한다


§조건 제어문에서 조건이 NULL 을 반환하면 연관된 명령문이 실행되지 않는다.


– 논리테이블



 


F. 반복제어 : LOOP 문


1) Basic Loop


§Syntax

LOOP


statement1;



EXIT [WHEN condition];


END LOOP;




ex)


declare


v_countryid  locations.country_id%type := ‘CA’;


v_loc_id  locations.location_id%type;


v_counter  number(2) := 1;


v_new_city  locations.city%type := ‘Montreal’;


begin


select max(location_id) into v_loc_id from locations


where country_id = v_countryid;


loop


insert into locations(location_id, city, country_id)


values((v_loc_id + v_counter), v_new_city, v_countryid);


v_counter := v_counter + 1;


exit when v_counter > 3;


end loop;


end;


/



2) while Loop


§Syntax

WHILE condition loop


statement1;


statement2;



END LOOP;



ex)


declare


v_counterid  locations.country_id%type := ‘CA’;


v_loc_id  locations.location_id%type;


v_new_city  locations.city%type := ‘Montreal’;


v_counter  number := 1;


begin


select max(location_id) into v_loc_id from locations


where country_id = v_countryid;


while v_counter <= 3 loop


insert into locations(location_id, city, country_id)


values((v_loc_id + v_counter), v_new_city, v_counteryid);


v_counter := v_counter + 1;


end loop;


end;


/



3) FOR Loop


§반복 횟수에 대한 테스트를 단축하려면 FOR loop 사용

§카운터는 묵시적으로 선언되므로 선언하지 않아도 된다.


§Syntax

FOR counter IN [REVERSE]


  lower_bound..upper_bound LOOP


  statement1;


  statement2;


 


END LOOP;




ex)


declare


v_counterid  locations.country_id%type := ‘CA’;


v_loc_id  locations.location_id%type;


v_new_city  locations.city%type := ‘Montreal’;


begin


select max(location_id) into v_loc_id from locations


where country_id = v_countryid;


for I in 1..3 loop


  insert into locations(location_id, city, country_id)


  values((v_loc_id + i), v_new_city, v_countryid);


end loop;


end;


/



– FOR Loop 규칙


§loop 안에 있는 카운터만 참조 할 것.


§카운터를 할당 대상으로 참조하지 말 것.


§loop 상한이나 하한은 null 이면 안된다.

 


G. Loop 의 권장 사용법


§loop 안의 문장이 적어도 한번 실행 되어야 하는 경우에는 Basic loop 사용


§매번 반복을 시작할 때마다 조건이 평가 되어야 하는 경우에는 WHILE Loop 사용


§반복 횟수를 알 수 있는 경우에는 FOR Loop 사용

 


H. 중첩 loop 및 label


§다중 레벨로 loop를 중첩시킬 수 있다.


§블록과 loop의 구분에 label을 사용한다.


§label을 참조하는 EXIT 문을 사용하여 외부 loop를 종료한다.

ex)


declare


v_outerc number := 1;


v_innerc number := 1;


v_result number;


begin


<<outer_loop>>


loop


v_outerc:= v_outerc+1;


       exit when v_outerc>15;


<<inner_loop>>


loop


exit outer_loop when v_outerc > 9;


v_result := v_outerc * v_innerc;


dbms_output.put_line(v_outerc || ‘ * ‘ || v_innerc || ‘ = ‘ || v_result);


v_innerc := v_innerc + 1;


exit when v_innerc > 9;


end loop inner_loop;


v_innerc := 1;


end loop outer_loop;


end;


/



 


I. CONTINUE

 

§정의

§다음 loop 반복을 시작하는 기능을 추가

§프로그래머에게 제어를 다음 루프 반복으로 전이하는 기능을 제공합니다.

§EXIT 문에 대한 의미와 병렬 구조를 사용합니다.

§이점

§프로그래밍 프로세스를 용이하게 합니다.

§CONTINUE 문을 시뮬레이트 하는 이전 프로그래밍 해결책보다 다소 성능이 향상 될 수 있습니다.

 


ex)


1)



declare


v_total simple_integer := 0;


begin


for i in 1..10 loop


v_total := v_total + i;


dbms_output.put_line(‘Total is: ‘ || v_total);


continue when i > 5;


v_total := v_total + i;


dbms_output.put_line(‘Out of Loop Total is: ‘|| v_total);


end loop;


end;


/



2)


declare


v_total number := 0;


begin


<<before>>


for i in 1..10 loop


v_total := v_total + 1;


dbms_output.put_line(‘Total is : ‘ || v_total);


for j in 1..10 loop


continue before when I + j > 5;


v_total := v_total + 1;


end loop;


end loop;


end;


/



3)


begin
  
for i in reverse 1 .. 10 loop
     
dbms_output.put_line (lpad (‘*’, i, ‘*’));
  
end loop;
end;


================================================


declare


        cnt     number :=1;


begin


        while cnt <= 10 loop


                dbms_output.put_line (lpad(‘*’,(11-cnt),’*’));


                cnt := cnt + 1;


        end loop;


end;


 

 


 


 

By haisins

오라클 DBA 박용석 입니다. haisins@gmail.com 으로 문의 주세요.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다