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;

 

 

 

 

사업자 정보 표시
(주)블루원 | 김홍태 | 서울특별시 용산구 원효로 4가 135 금홍 2빌딩 | 사업자 등록번호 : 106-86-76684 | TEL : 02-3272-7200 | Mail : support_ora@blueone.co.kr | 통신판매신고번호 : 호 | 사이버몰의 이용약관 바로가기

'DB - ORACLE > Oracle DB Admin ' 카테고리의 다른 글

7. PL/SQL 명시적 커서 사용  (0) 2016.01.04
6. PL/SQL 조합 데이터 유형 작업  (0) 2016.01.03
4. PL/SQL 프로그램의 SQL문  (0) 2016.01.03
3. PL/SQL 실행문 작성  (0) 2016.01.03
2. PL/SQL 변수 선언  (0) 2016.01.03

+ Recent posts