ORACLE/PL/SQL

Loop / For Loop / While Loop

zammanza 2012. 3. 20. 16:22
======================
== Loop문 프로시저
====================== 


====loop 문 =============================
declare

begin
loop

exit when 이것이 참이라면 끝내라
end loop;
end;
/
=========================================

이름이 없는 프로시저는 declare 로 선언한다.

declare
v_cnt number(2) :=1;
v_name varchar2(20);

begin
delete loop1;
loop
v_name := ('박정수'|| v_cnt);
insert into loop1(no,name) values(v_cnt,v_name);
v_cnt :=v_cnt +1;
exit when v_cnt > 10;
end loop;
commit;
dbms_output.put_line('데이터 입력완료');
end;
/


<문제> 시작값에서 하나씩 증가해서 마지막 값까지의 합을 구하라..!!
[exec p_calc(1,10) ===>55 가 나오도록 프로시저 생성]

create or replace procedure p_calc
(v_start in number, v_end in number)
is
cnt number := v_start;
tot number := 0;
begin
loop
tot := tot + cnt;
cnt := cnt + 1;
exit when cnt > v_end ;
end loop;
dbms_output.put_line(v_start || '부터' || v_end || '까지의 합은' || tot || '입니다.');
end;
/

<문제> 별을 10개 찍어 봅시다.. 빠져봅시다.!!
*
**
***
****
*****
******
*******
********
*********
**********

[방법1]
declare
v_cnt number := 0;
v_str varchar2(20) := '*';
begin
loop
dbms_output.put_line(v_str);
v_str := v_str || '*';
v_cnt := v_cnt +1;
exit when v_cnt >= 10;
end loop;
end;
/


[방법2]
declare
v_cnt number := 0;
v_str varchar2(20) := '*';
begin
loop
dbms_output.put_line(v_str);
v_cnt := v_cnt +1;
v_str := lpad('*',v_cnt+1,'*');
exit when v_cnt >= 10;
end loop;
end;
/

======================
== For Loop문 프로시저
====================== 


<문제> 시작값에서 하나씩 증가해서 마지막 값까지의 합을 구하라..!!
[exec p_calc(1,10) ===>55 가 나오도록 프로시저 생성]

create or replace procedure p_cal
(v_start in number, v_end in number)
is
cnt number := v_start;
tot number := 0;
begin
for i in v_start..v_end Loop

tot := tot + cnt;
cnt := cnt + 1;
exit when cnt > v_end ;
end loop;
dbms_output.put_line(v_start || '부터' || v_end || '까지의 합은' || tot || '입니다.');
end;
/


<문제> 별을 5개 찍어 봅시다.. 빠져봅시다.!!
*
**
***
****
*****

declare
v_str varchar2(10);
begin
for i in 1..5 loop
v_str := lpad('*',i,'*');
dbms_output.put_line(v_str);
end loop;
end;
/

::::: 만약 for i in reverse 1..5 loop 면 --> 5부터 1까지 감소 :::::

=========================
== WHILE Loop문 프로시저
=========================


<문제> while loop 문 최종값과 반복회수 구하기

create or replace procedure banbok2
(v_lower number, v_upper number)
is
v_counter number := 0;
v_output number := v_lower;
begin
while (v_output <= v_upper) loop
v_counter := v_counter +1 ; --총 반복회수
v_output := v_output + 1 ; --최종값
end loop;
dbms_output.put_line ('최종값은' || to_char(v_output-1) ||'이고'
||'총 반복회수는' || v_counter || '이다');
end;
/

exec banbok2(8,10);
최종값은 10이고 반복회수는 3 이다.



<문제> 시작값에서 하나씩 증가해서 마지막 값까지의 합을 구하라..!!
[exec p_calc(1,10) ===>55 가 나오도록 프로시저 생성]


create or replace procedure p_calw
(v_start number, v_end number) ----- 2, 10 2+3+4+5+..9+10
is
tot number := 0;
cnt number := v_start;

begin
while cnt <= v_end loop
tot := tot + cnt;
cnt := cnt + 1 ;

end loop;

dbms_output.put_line(v_start || '부터' || v_end || '까지의 합은' || tot || '입니다.');
end;
/

<문제> 별을 10개 찍어 봅시다.. 빠져봅시다.!!
*
**
***
****
*****
******
*******
********
*********
**********

declare
v_str varchar2(20) ;
v_cnt number := 0;
begin
while v_cnt < 10 loop
v_cnt := v_cnt + 1;
v_str := lpad('*',v_cnt,'*');
dbms_output.put_line(v_str);
end loop;
end;
/

<문제> 원하는 수만큼 아래와 같이 나타나게 loop 안의 loop문으로 구성 
*
a*
aa*
aaa*
aaaa*


create or replace procedure p_while2
(v_jul in number)
is
i number :=0;
j number :=0;
v_str varchar2(10) :=null;
begin
while(i < v_jul) loop
while (k < i) loop
v_str := lpad('a',i,'a');
k:=k+1;
end loop;
i:=i+1;
k:=0;
v_str := v_str || '*';
dbms_output.put_line(v_str);
v_str :=null;
end loop;
end;
/



출처 : http://cafe.naver.com/ac1561/164