-
[PLSQL] if, case, loopDataBase/PLSQL 2022. 9. 9. 16:59
if문
1. 경우의 수가 둘 중 하나이고 단독 IF로 사용할 때
if 조건 then 실행문1 end if
2. 경우의 수가 둘 중 하나이고 else와 함께 사용할 때
if 조건 then 실행문1 else 실행문2 end if
3. 경우의 수가 셋 이상일 때
if 조건 then 실행문1 elsif 조건2 then --오타아님주의 elsif 실행문2 else 실행문3 end if
연습하기
DECLARE vn_num1 NUMBER := 1; vn_num2 NUMBER := 2; BEGIN IF vn_num1 >= vn_num2 THEN DBMS_OUTPUT.PUT_LINE(vn_num1 || '이(가) 큰 수'); ELSE DBMS_OUTPUT.PUT_LINE(vn_num2 || '이(가) 큰 수'); END IF; END;
-- emp 테이블에서 사원 한명을 선별하여, -- 그 월급의 금액에 따라 낮음, 중간, 높음 이라는 단어를 출력하는 -- 익명 블럭을 제작. (1~1000 낮음 1001~2500 보통 2501~ 높음) -- 사원을 선별하는 방법은 RANDOM.VALUE 함수를 이용함 -- 랜덤한 부서번호로 조회하되 -- 그 부서에 사원이 여럿이면 첫번째 사원으로 선택 DECLARE v_sal NUMBER := 0; -- 선택된 사원의 급여를 저장할 변수 v_deptno NUMBER := 0; -- 랜덤하게 발생한 부서번호를 저장할 변수 BEGIN -- 랜덤하게 부서번호를 발생 -- DBMS_RANDOM.VALUE(시작숫자, 끝숫자): 시작숫자부터 끝숫자 사이의 임의 숫자를 발생함. -- ROUND(숫자, 반올림자리수): 숫자를 지정된 반올림자리에서 반올림함. -- 반올림자리수 1이면 소수점둘재자리에서 반올림해서 첫째자리까지 남김. -- 반올림자리수 -1이면 1의 자리에서 반올림. v_deptno := ROUND( DBMS_RANDOM.VALUE(10,40), -1); -- DBMS_OUTPUT.PUT_LINE(v_deptno); select sal into v_sal from emp where deptno=v_deptno and rownum=1; DBMS_OUTPUT.PUT_LINE(v_deptno); DBMS_OUTPUT.PUT_LINE(v_sal); IF v_sal BETWEEN 1 AND 1000 THEN DBMS_OUTPUT.PUT_LINE('낮음'); ELSIF v_sal >= 1001 AND v_sal <= 2500 THEN DBMS_OUTPUT.PUT_LINE('보통'); ELSIF v_sal > 2500 THEN DBMS_OUTPUT.PUT_LINE('높음'); END IF; END;
case
DECLARE v_sal NUMBER := 0; v_deptno NUMBER := 0; BEGIN v_deptno := ROUND( DBMS_RANDOM.VALUE(10,40), -1); select sal into v_sal from emp where deptno=v_deptno and rownum=1; DBMS_OUTPUT.PUT_LINE(v_deptno); DBMS_OUTPUT.PUT_LINE(v_sal); CASE WHEN v_sal BETWEEN 1 AND 1000 THEN DBMS_OUTPUT.PUT_LINE('낮음'); WHEN v_sal >= 1001 AND v_sal <= 2500 THEN DBMS_OUTPUT.PUT_LINE('보통'); WHEN v_sal > 2500 THEN DBMS_OUTPUT.PUT_LINE('높음'); END CASE; END;
CASE 유형 1.
CASE WHEN 조건식1 THEN 실행문1 WHEN 조건식2 THEN 실행문2 ... ELSE 실행문3 END CASE;
CASE 유형 2.
-표현식의 결과 값 또는 변수의 값들의 경우의 수로 분기함
CASE 조건식 또는 표현식 또는 변수 CASE WHEN 값1 THEN 실행문1 WHEN 값2 THEN 실행문2 ... ELSE 실행문3 END CASE;
loop
LOOP 실행문; EXIT(WHEN조건); END LOOP;
DECLARE vn_base_num NUMBER:=7; -- 7단 vn_cnt NUMBER:=1; -- 반복 제어 변수 겸 승수 BEGIN LOOP DBMS_OUTPUT.PUT_LINE(vn_base_num || '*' || vn_cnt || '=' || vn_base_num*vn_cnt); vn_cnt:=vn_cnt+1; -- 반복제어 변수 1 증가 EXIT WHEN vn_cnt>9; -- 반복제어 변수가 9를 초과하면 반복실행 멈춤 END LOOP; END;
1. while
WHILE 조건 LOOP 실행문 END LOOP;
DECLARE vn_base_num NUMBER:=6; vn_cnt NUMBER:=1; BEGIN WHILE vn_cnt<=9 --vn_cnt가 9보다 작거나 같은 경우에만 반복 실행 LOOP DBMS_OUTPUT.PUT_LINE(vn_base_num || '*' || vn_cnt || '=' || vn_base_num*vn_cnt); vn_cnt:=vn_cnt+1; -- vn_cnt 값을 1씩 증가 END LOOP; END;
-- WHILE과 EXIT WHEN의 혼합사용 DECLARE vn_base_num NUMBER:=9; vn_cnt NUMBER:=1; BEGIN WHILE vn_cnt<=9 --vn_cnt가 9보다 작거나 같은 경우에만 반복 실행 LOOP DBMS_OUTPUT.PUT_LINE(vn_base_num || '*' || vn_cnt || '=' || vn_base_num*vn_cnt); EXIT WHEN vn_cnt=5; vn_cnt:=vn_cnt+1; -- vn_cnt 값을 1씩 증가 END LOOP; END;
2. for
-시작값부터 끝까지 반복실행함
FOR 변수명 IN (REVERSE) 시작값...끝값 LOOP 실행문 END LOOP;
DECLARE vn_base_num NUMBER:=0; BEGIN FOR i IN 1..9 LOOP DBMS_OUTPUT.PUT_LINE(vn_base_num || '*' || i || '=' || vn_base_num*1); END LOOP; END;
3. reverse
-반대방향의 숫자진행으로 반복실행
-- REVERSE을 사용한 경우 DECLARE vn_base_num NUMBER:=8; BEGIN FOR i IN REVERSE 1..9 LOOP DBMS_OUTPUT.PUT_LINE(vn_base_num || '*' || i || '=' || vn_base_num*1); END LOOP; END;
4. continue
-조건이 충족하면 반복실행 영역 중 나머지 명령을 실행하지 않고 다음 반복으로 진행
DECLARE vn_base_num NUMBER:=9; BEGIN FOR i IN 1..9 LOOP CONTINUE WHEN i=5; DBMS_OUTPUT.PUT_LINE(vn_base_num || '*' || i || '=' || vn_base_num*1); END LOOP; END;
5. GOTO문
DECLARE vn_base_num NUMBER:=5; BEGIN <<fifth>> -- 라벨이라고 부름. GOTO문의 이동 목적지로 사용되곤 함 FOR i IN 1..9 LOOP DBMS_OUTPUT.PUT_LINE(vn_base_num || '*' || i || '=' || vn_base_num*i); IF i =3 THEN GOTO sixth; END IF; END LOOP; <<sixth>> vn_base_num :=6; FOR i IN 1..9 LOOP DBMS_OUTPUT.PUT_LINE(vn_base_num || '*' || i || '=' || vn_base_num*i); END LOOP; END;
6. null
-if문 또는 case when 등에서 해당 경우에 실행해야할 명령이 하나도 없을때 쓰는 구문
IF vn_variable = 'A' THEN 처리로직1; ELSIF vn_variable='B' THEN 처리로직2; ELSE NULL; END IF; CASE WHEN vn_variable = 'A' THEN 처리로직1; WHEN vn_variable='B' THEN 처리로직2; ELSE NULL; END IF;
'DataBase > PLSQL' 카테고리의 다른 글
[PLSQL] cursor (0) 2022.09.09 [PLSQL] procedure (1) 2022.09.09 [PLSQL] function (0) 2022.09.09 [PLSQL] block, 출력, 변수, 자료형, SQL (0) 2022.09.09 [PLSQL] Procedural Language for SQL 설치 (0) 2022.09.09