Oracle

반복문(basic loop, while, for loop, continue)

봉프랑뜨앙떼 2017. 9. 15. 16:03

/* basic loop문
  -- 일단 한 번 실행 후 종료조건 만족하면 종료
  loop
    pl/sql 문장;
    exit 종료조건;
  end loop;

*/

set serveroutput on;

declare
  num number := 0;
begin
  loop
    dbms_output.put_line(num);
    num := num+1;
    exit when num > 10;
  end loop;
end;
/


/* 
while문
  -- 조건을 먼저 확인 후 실행
  while 반복조건 loop
    실행 문장;
  end loop;
*/

declare
  num number := 0;
begin
  while num < 11 loop
    dbms_output.put_line(num);
    num:=num+1;
  end loop;
end;
/

declare
  num number:=10;
begin
  loop
    dbms_output.put_line(num);
    num:=num-1;
    exit when num = 0;
  end loop;
end;
/

declare
  num number:=10;

begin
  while num >= 0 loop  
    dbms_output.put_line(num);
    num:=num-1;
  end loop;
end;
/

/* 
For 문 : 반복횟수를 지정할 수 있다.
구문 형식
  For n:카운트 횟수 IN start..end Loop
    실행문장;
  end loop;
*/

-- for문은 변수가 필요없어서 따로 선언해줄 필요가 없다  
begin
  for n in 0..10 loop
    dbms_output.put_line(n);
  end loop;
end;
/

-- 역순 실행
begin
  for n in reverse 0..10 loop
    dbms_output.put_line(n);
  end loop;
end;
/


/* 사원테이블에서 사원id를 입력받아서 사원 이름의 문자수만큼 # 출력하는 pl/sql문 */

declare 
  emp_name employees.first_name%type;
     
begin
  select first_name
  into emp_name
  from employees
  where employee_id='&empid';
  
  dbms_output.put_line(emp_name);
  
  for n in 1..length(emp_name) loop
    dbms_output.put_line('#');
  end loop;
end;
/


declare 
  emp_id employees.employee_id%type := &emp_num;
  emp_name employees.first_name%type;
  v_no number;
  v_char varchar2(30);
  
begin
  select first_name, length(first_name)
  into emp_name, v_no
  from employees  
  where employee_id = emp_id;
  
  dbms_output.put_line(emp_name);
  
  for n in 1..v_no loop
    v_char := v_char||'#';
    dbms_output.put_line(v_char);    
  end loop;
end;
/

/* continue문 보조제어문(11g부터 추가된 기능) */
declare
  tot number := 0;
begin
  for i in 1..10 loop
    tot := tot+1;
    dbms_output.put_line('tot : '||tot);
    continue when(i > 5); -- i가 5보다 크면 위로 올라가서 실행(더이상 아래로 실행X)
    tot := tot+i;
    dbms_output.put_line('tot2 : '||tot);
  end loop;
end;
/