220713 TIL

Yeoni·2022년 7월 13일
0

국비교육TIL

목록 보기
31/41

국비교육 31일차 Oracle: 예외절(Exception) 처리, 제어문(IF문), 반복문

1. 예외절(Exception) 처리

1) 예외절(Exception)

  • 프로시저에서 데이터(행)가 없을 경우 "no data found" 라는 오류가 발생한다.
create or replace procedure 프로시저명
is
	-- 변수의 선언부
begin 
	-- 
	EXCEPTION 
            WHEN no_data_found THEN 
            -- no_data_found 은 오라클에서 데이터가 존재하지 않을 경우 발생하는 오류임.
                 dbms_output.put_line('경고문구');
end

2) 사용자 정의 예외절

예외절 = 오류절

※ 형식

exception
when  익셉션이름1  [or 익셉션이름2]  then
    실행문장1;
    실행문장2;
    실행문장3;
    
when  익셉션이름3  [or 익셉션이름4]  then
    실행문장4;
    실행문장5;
    실행문장6; 
    
when  others  then  
    실행문장7;
    실행문장8;
    실행문장9; 

2. 제어문(IF문)

1) 제어문 형식

if     조건1  then  실행문장1;
elsif  조건2  then  실행문장2;
elsif  조건3  then  실행문장3;
else                실행문장4;
end if; 
  • 제어문과 exception
create or replace function func_age_2
(p_jubun in varchar2)
return number 
is
    -- 변수명          -- 변수타입
    v_age             number(3);
    v_year            number(4);
    v_gender_number   varchar2(1) := substr(p_jubun,7,1);
                      -- int a = 0; 또는 int a; a=1;
                      -- 와 유사하게 처음부터 값을 넣어주겠다는 의미
    error_jubun       EXCEPTION; 
    -- error_jubun은 사용자가 정의하는 예외절(EXCEPTION)임을 선언한다.                    
begin 
    if    v_gender_number in('1','2') then v_year := 1900;
    elsif v_gender_number in('3','4') then v_year := 2000;
    else  RAISE error_jubun; -- error_jubun은 사용자가 정의하는 예외절(Exception)이다. -- 에러나서 error_jubun를 세워서 아래로 내려감
    end if;

    v_age := extract(year from sysdate) - ( to_number(substr(p_jubun,1,2)) + v_year ) +1;
    -- select해서 와도 괜찮고 v_age처럼 변수에 바로 넣어도 된다. 
    return v_age;
    
    EXCEPTION 
        WHEN error_jubun THEN 
             RAISE_APPLICATION_ERROR(-20001, '>> 주민번호 성별은 1,2,3,4 중에 하나이어야 합니다. <<');
             -- -20001 은 오류번호로써, 
             -- 사용자가 정의해주는 EXCEPTION 에 대해서는 오류번호를 
             -- -20001 부터 -20999 까지만 사용하도록 오라클에서 비워두었다.
        WHEN others then
            RAISE_APPLICATION_ERROR(-20001, '>> 올바른 주민번호가 아닙니다. <<');
            -- 만일 문자를 입력하여 to_number에서 오류가 나면
            -- error_jubun을 제외한 나머지 오류기 때문에 여기로 옴.
end func_age_2;
-- Function FUNC_AGE_2이(가) 컴파일되었습니다.

3. 반복문

기본 LOOP문, FOR LOOP문, WHILE LOOP문

1) 기본 LOOP문

(1) 문법

LOOP
   실행문장;
	EXIT WHEN 탈출조건;   -- 탈출조건이 참 이라면 LOOP 를 탈출한다.
END LOOP;

(2) LOOP문을 사용하여 20000개 행 insert

  • tbl_looptest_1 테이블 생성
create table tbl_looptest_1 
(bunho      number
,name       varchar2(50)
);
  • tbl_looptest_1 테이블에 행을 20000개를 insert
create or replace procedure pcd_tbl_looptest_1_insert
(p_name     IN      tbl_looptest_1.name%type
,p_count    IN      number) -- p_count에 20000을 넣을 것이다.  
is
    v_bunho    tbl_looptest_1.bunho%type := 0; -- 변수의 초기화!!!(변수에 값을 처음부터 넣어주기)
begin
    LOOP
        v_bunho := v_bunho + 1;
        EXIT WHEN v_bunho > p_count; 
        insert into tbl_looptest_1(bunho, name) values(v_bunho, p_name||v_bunho);
    END LOOP;
end pcd_tbl_looptest_1_insert;

exec pcd_tbl_looptest_1_insert('홍길동', 20000);
-- 홍길동을 20000번 넣어라
-- PL/SQL 프로시저가 성공적으로 완료되었습니다.

(3) 익명 프로시저(Anonymous Procedure)

  • 이름이 없는 익명 프로시저(Anonymous Procedure)로 tbl_looptest_1 테이블에 행을 20000개를 insert
declare  -- 이름이 없는 프로시저는 declare 다음에 선언
    v_bunho     number := 50000;            -- 변수의 선언 및 초기화
    v_count     number := 0;                   -- 변수의 선언 및 초기화
    v_name      varchar2(20) := '홍길동 ';    -- 변수의 선언 및 초기화
begin
    LOOP
        v_bunho := v_bunho + 1; -- 번호는 50000부터 50001, 50002로 늘어나고 
        v_count := v_count +1;  
        EXIT WHEN v_count > 20000; 
        -- 여기는 20001이 되는 순간(20000번 반복이 끝나는 순간) 빠져나가라는 것이다.
        insert into tbl_looptest_1(bunho, name) values(v_bunho, v_name||v_count);
    END LOOP;
end;
-- PL/SQL 프로시저가 성공적으로 완료되었습니다.
-- 컴파일 없이 바로 실행

2) FOR LOOP문

(1) 문법

[문법]
for 변수 in [reverse] 시작값..마지막값 loop
    실행문장;
end loop;
  • tbl_looptest_1 테이블에 행을 20000개를 insert
create or replace procedure pcd_tbl_looptest_1_insert_2
(p_name     IN      tbl_looptest_1.name%type
,p_count    IN      number) -- p_count에 20000을 넣을 것이다.  
is -- i가 돌아가며 들어갈 것이라 변수가 필요없다. 
begin
   for i in 1..p_count loop -- 변수 i에 맨처음에는 1이 들어가고 다음에는 매번 1씩 증가된 값이
                            --  i에 들어가는데 p_count 까지 i에 들어간다.
       insert into tbl_looptest_1(bunho, name) values(i, p_name||i);
    end loop;
end pcd_tbl_looptest_1_insert_2;
-- Procedure PCD_TBL_LOOPTEST_1_INSERT_2이(가) 컴파일되었습니다.

exec pcd_tbl_looptest_1_insert_2('홍길동', 20000);
-- PL/SQL 프로시저가 성공적으로 완료되었습니다.

3) WHILE LOOP문

(1) 문법

while 조건 LOOP
    실행문장; -- 조건이 참이라면 실행문장;을 실행한다. 조건이 거짓이 되면 반복문을 빠져나간다. 
END LOOP;

while NOT 조건 LOOP -- java의 느낌표 같음
    실행문장; -- not(조건)이 참이라면 실행문장;을 실행한다. not(조건)이 거짓이 되면 반복문을 빠져나간다. 
END LOOP;
  • while문으로 100번 넣기
declare 
    v_name varchar2(20) := '홍길동'; -- 변수의 선언 및 초기화
    v_cnt  number(3) := 1;
begin  
    while v_cnt <= 100 LOOP --100 이하가 참이라면
          insert into tbl_looptest_1(bunho, name) values(v_cnt, v_name||v_cnt);
          v_cnt := v_cnt + 1;
          -- 조건이 참이라면 실행문장;을 실행한다. 조건이 거짓이 되면 반복문을 빠져나간다. 
    END LOOP;
end; 
-- PL/SQL 프로시저가 성공적으로 완료되었습니다.
  • while not 으로 100번 넣기
declare 
    v_name varchar2(20) := '홍길동'; -- 변수의 선언 및 초기화
    v_cnt  number(3) := 1;
begin  
    while not(v_cnt > 100) LOOP -- 101 들어온 순간 그만. 
    							-- v_cnt := v_cnt + 1; 이게 제일 아래에 있어서 가능
                                -- not(탈출조건)은 탈출조건이 참이라면 전체가 거짓이 되어지므로, 반복문을 빠져나간다. 
          insert into tbl_looptest_1(bunho, name) values(v_cnt, v_name||v_cnt);
          v_cnt := v_cnt + 1;
          -- not(조건)이 참이라면 실행문장;을 실행한다. not(조건)이 거짓이 되면 반복문을 빠져나간다. 
    END LOOP;
end; 
-- PL/SQL 프로시저가 성공적으로 완료되었습니다.
profile
이런 저런 기록들

0개의 댓글