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;