국비교육 31일차 Oracle: 예외절(Exception) 처리, 제어문(IF문), 반복문
create or replace procedure 프로시저명
is
-- 변수의 선언부
begin
--
EXCEPTION
WHEN no_data_found THEN
-- no_data_found 은 오라클에서 데이터가 존재하지 않을 경우 발생하는 오류임.
dbms_output.put_line('경고문구');
end
예외절 = 오류절
※ 형식
exception
when 익셉션이름1 [or 익셉션이름2] then
실행문장1;
실행문장2;
실행문장3;
when 익셉션이름3 [or 익셉션이름4] then
실행문장4;
실행문장5;
실행문장6;
when others then
실행문장7;
실행문장8;
실행문장9;
if 조건1 then 실행문장1;
elsif 조건2 then 실행문장2;
elsif 조건3 then 실행문장3;
else 실행문장4;
end if;
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이(가) 컴파일되었습니다.
기본 LOOP문, FOR LOOP문, WHILE LOOP문
LOOP
실행문장;
EXIT WHEN 탈출조건; -- 탈출조건이 참 이라면 LOOP 를 탈출한다.
END LOOP;
create table tbl_looptest_1
(bunho number
,name varchar2(50)
);
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 프로시저가 성공적으로 완료되었습니다.
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 프로시저가 성공적으로 완료되었습니다.
-- 컴파일 없이 바로 실행
[문법]
for 변수 in [reverse] 시작값..마지막값 loop
실행문장;
end loop;
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 프로시저가 성공적으로 완료되었습니다.
while 조건 LOOP
실행문장; -- 조건이 참이라면 실행문장;을 실행한다. 조건이 거짓이 되면 반복문을 빠져나간다.
END LOOP;
while NOT 조건 LOOP -- java의 느낌표 같음
실행문장; -- not(조건)이 참이라면 실행문장;을 실행한다. not(조건)이 거짓이 되면 반복문을 빠져나간다.
END LOOP;
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 프로시저가 성공적으로 완료되었습니다.
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 프로시저가 성공적으로 완료되었습니다.