PL/SQL - 반복문 1

jsbak·2020년 8월 31일
0

DB

목록 보기
23/35

PL/SQL - 반복문

  • PL/SQL의 반복문에는 LOOP, WHILE, FOR문 제공

1)LOOP문

  • 반복문의 기본구조
  • 주로 커서문과 함께 사용
  • 사용방법
 LOOP
   반복처리문;
   EXIT WHEN 조건;  // 반복처리문과 순서가 바뀌어도됨.
 END LOOP;
  **'조건'이 참(TRUE)이면 반복을 벗어남**

예시) 구구단의 단을 입력받아 해당 구구단출력

accept P_base   prompt '단(2~9) 입력 : ' --출력문
declare
  v_base number := to_number('&p_base'); 
  --&p_base에 값을 받으면 ''때문에 문자열이 되기때문에 숫자로 바꿔줌.
  v_cnt number := 1; -- number타입은 반드시 초기화
begin
  loop
    dbms_output.put_line(v_base||'*'||v_cnt||'='||v_base*v_cnt);
    exit when v_cnt=9;
    v_cnt:=v_cnt+1;
  end loop;
end;


예시) 1~50사이의 FIBONACCI NUMBER를 구하라.

declare
  v_num number := 0;    --피보나치 수가 저장될 공간
  vp_num number := 1;   --전(前)수
  vpp_num number := 1; --전전(前前)수
  v_result varchar2(100);
begin 
  v_result := to_char(vp_num)||', '||to_char(vpp_num);
  loop
    v_num := vpp_num+vp_num;
    exit when v_num >= 50;
    v_result :=v_result||', '||to_char(v_num);
    vpp_num := vp_num;
    vp_num := v_num;
  end loop;
  dbms_output.put_line(v_result);
end;


예시) 회원테이블에서 마일리지가 3000이상인 회원의 이름, 직업, 마일리지를 구하는 커서를 생성하고 커서결과를 처리할때 성별을 구별하여 '여성회원','남성회원'을 출력하시오. (커서를 사용한 예)

declare
  v_name member.mem_name%type;
  v_job member.mem_job%type;
  v_mile member.mem_mileage%type;
  v_gender varchar2(30);
  v_id char(1);
  cursor cur_mem2
   is
        select mem_name,mem_job,mem_mileage
          from member
         where mem_mileage>=3000;
begin 
  open cur_mem2;
  loop
    fetch cur_mem2 into v_name, v_job, v_mile;
    exit when cur_mem2%notfound;
    -- 행의 데이터가 없으면 끝내겠다.
    select substr(mem_regno2,1,1) into v_id
    -- substr(mem_regno2,1,1)를 into >> v_id에 넣어라
      from member
     where mem_name = v_name;
     if v_id='1' or v_id='3' then
       v_gender:='남성회원';
     else
       v_gender:='여성회원';
     end if;
     dbms_output.put_line('회원명 : '||v_name);
     dbms_output.put_line('성별 : '||v_gender);
     dbms_output.put_line('직업 : '||v_job);
     dbms_output.put_line('마일리지 : '||v_mile);
     dbms_output.put_line('-------------------');
  end loop;
  dbms_output.put_line('회원수 : '||cur_mem2%rowcount);
  close cur_mem2;
end;

2)WHILE문

  • 다른 애플리케이션 개발언어의 WHILE문과 같은 기능 제공
  • 사용형식
  WHILE 조건
    LOOP
      반복처리문;
  END LOOP;'조건'이 참(true)이면 반복 수행하고 거짓(false)이면 반복문을 벗어난다.

예시) 구구단 7단을 출력

declare
  v_cnt number := 0;
  v_result varchar2(50);
begin
  while v_cnt < 9 loop
    v_cnt := v_cnt+1;
    v_result:='7 * '||V_CNT||'='||v_cnt*7;
    dbms_output.put_line(v_result);
  end loop;
end;


예시) 사원테이블에서 부서코드 50번 부서의 사원명, 부서명, 직책명을 추출하는 커서를 생성하고 출력하는 PL/SQL을 작성하시오

declare
  v_emp_name employees.emp_name%type;
  v_dept_name departments.department_name%type;
  v_job_name jobs.job_title%type;
  cursor cur_emp02 is
    select a.emp_name, b.department_name, c.job_title
      from employees a, departments b, jobs c
     where a.department_id = b.department_id
       and a.job_id = c.job_id
       and a.department_id = 50;
begin
  open cur_emp02;
  fetch cur_emp02 into v_emp_name, v_dept_name, v_job_name;
  while cur_emp02%found loop
    dbms_output.put_line('사원명:'||v_emp_name);
    dbms_output.put_line('부서명:'||v_dept_name);
    dbms_output.put_line('직책명:'||v_job_name);
    dbms_output.put_line('-------------------');
    fetch cur_emp02 into v_emp_name, v_dept_name, v_job_name;
  end loop;
  dbms_output.put_line('사원수:'||cur_emp02%rowcount);
  close cur_emp02;
end;

profile
끄적끄적 쓰는곳

0개의 댓글