1. 분기문
1) IF 문
- 프로그래밍 언어의 IF문과 동일 기능 제공
( 사용형식 -1 )
IF 조건 THEN
명령문;
ELSE
명령문;
END IF;
( 사용형식 -2 )
IF 조건 THEN
명령문;
ELSIF 조건 THEN
명령문;
ELSIF 조건 THEN
명령문;
ELSE
명령문;
END IF;
( 사용형식 -3 )
IF 조건 THEN
IF 조건 THEN
명령문;
ELSE
명령문;
END IF;
ELSE
명령문;
END IF;
예제) 키보드로 단을 입력받아 해당 구구단을 출력하는 익명 블록을 작성하시오
ACCEPT P_BASE PROMPT '구구단의 단입력(2-9) : '
DECLARE
V_BASE NUMBER := TO_NUMBER('&P_BASE');
BEGIN
FOR I IN 1..9 LOOP
DBMS_OUTPUT.PUT_LINE(V_BASE||'*'||I||'='||V_BASE*i);
END LOOP;
END;
예제)
임의의 부서코드(10-110)를 생성하여 해당부서에 속한 사원 중 첫번째로 검색되는 사원정보와
해당 사원의 급여를 이용하여
1 ~ 3000 사이이면 '저임금 사원',
3001 ~ 6000 사이이면 '중간임금 사원'
6001 이상이면 '고임금 사원' 메세지를 비고에 출력하시오
단, 출력할 사원정보는 사원번호, 사원명, 부서명, 급여, 비고
--죄종출력제시된 컬럼개수만큼 변수선언
DECLARE
V_EMP_ID EMPLOYEES.EMPLOYEE_ID%TYPE;
V_EMP_NAME EMPLOYEES.EMP_NAME%TYPE;
V_DEPT_NAME DEPARTMENTS.DEPARTMENT_NAME%TYPE;
V_DEPT_ID DEPARTMENTS.DEPARTMENT_ID%TYPE;
V_SAL EMPLOYEES.SALARY%TYPE;
V_REMARKS VARCHAR2(50);
BEGIN
--부서번호 생성
V_DEPT_ID :=ROUND(DBMS_RANDOM.VALUE(10,120),-1);
SELECT A.EMPLOYEE_ID, A.EMP_NAME, B.DEPARTMENT_NAME, A.SALARY
INTO V_EMP_ID,V_EMP_NAME,V_DEPT_NAME,V_SAL
FROM EMPLOYEES A, DEPARTMENTS B
WHERE A.DEPARTMENT_ID=B.DEPARTMENT_ID
AND A.DEPARTMENT_ID=V_DEPT_ID
AND ROWNUM=1;
IF V_SAL BETWEEN 1 AND 3000 THEN
V_REMARKS := '저임금 사원';
ELSIF V_SAL BETWEEN 3001 AND 6000 THEN
V_REMARKS := '중간임금 사원';
ELSE
V_REMARKS := '고임금 사원';
END IF;
DBMS_OUTPUT.PUT_LINE('사원번호 : ' ||V_EMP_ID);
DBMS_OUTPUT.PUT_LINE('사원명 : ' ||V_EMP_NAME);
DBMS_OUTPUT.PUT_LINE('부서명 : ' ||V_DEPT_NAME);
DBMS_OUTPUT.PUT_LINE('급여 : ' ||V_SAL);
DBMS_OUTPUT.PUT_LINE('비고 : ' ||V_REMARKS);
DBMS_OUTPUT.PUT_LINE('------------------------');
END;
예제)
매출테이블(CART)에서 2005년 6월 매출액집계를 조회하여
매출액이 1-50만원 이면 마일리지를 30점
50만원 초과 100만원 이하이면 50점
100만원 초과 200만원 이면 70점
그 이상이면 100점을 추가 지급하는 익명블록을 작성하시오
--회원번호별 매출액 계산해서 업데이트 맴버테이블을 그회원에가서 마일리지 꺼내서 그구간에 따라서 넣음
(2005년 6월 회원별 매출액집계 커서)--커서에서 한줄씩꺼내서 쓴다
CURSOR CUR_MILE
IS
SELECT CART_MEMBER,
SUM(CART_QTY*PROD_PRICE)
FROM CART, PROD
WHERE CART_PROD=PROD_ID
AND CART_NO LIKE '200506%'
GROUP BY CART_MEMBER;
----------------------------------
DECLARE
V_PMILE MEMBER.MEM_MILEAGE%TYPE;
V_UMILE MEMBER.MEM_MILEAGE%TYPE;
CURSOR CUR_MILE
IS
SELECT CART_MEMBER,
SUM(CART_QTY*PROD_PRICE) AS AMT
FROM CART, PROD
WHERE CART_PROD=PROD_ID
AND CART_NO LIKE '200506%'
GROUP BY CART_MEMBER;
BEGIN
FOR REC IN CUR_MILE LOOP
SELECT MEM_MILEAGE INTO V_PMILE
FROM MEMBER
WHERE MEM_ID=REC.CART_MEMBER;
IF REC.AMT <= 500000 THEN
V_UMILE:=V_PMILE+30;
ELSIF REC.AMT <= 1000000 THEN
V_UMILE:=V_PMILE+50;
ELSIF REC.AMT <= 2000000 THEN
V_UMILE:=V_PMILE+70;
ELSE
V_UMILE:=V_PMILE+100;
END IF;
UPDATE MEMBER
SET MEM_MILEAGE=V_UMILE
WHERE MEM_ID=REC.CART_MEMBER;
COMMIT;
DBMS_OUTPUT.PUT_LINE('회원번호 : '||REC.CART_MEMBER);
DBMS_OUTPUT.PUT_LINE('변경전 마일리지 : '||V_PMILE);
DBMS_OUTPUT.PUT_LINE('변경후 마일리지 : '||V_UMILE);
DBMS_OUTPUT.PUT_LINE('-----------------------');
END LOOP;
END;
2) CASE WHEN 문
- 다중분기
- 프로그래밍 언어의 SWITCH ~ CASE과 유사
( 사용 형식 )
CASE WHEN 조건1 THEN
명령문1;
WHEN 조건2 THEN
명령문2;
:
ELSE
명령문n;
END CASE;
( 사용형식 -2 )
CASE 변수 WHEN 값1 THEN
명령문1;
WHEN 값2 THEN
명령문2;
:
ELSE
명령문n;
END CASE;
예제)
키보드로 점수(0-100)를 입력 받아
90-100 : '수'
80-89 : '우'
70-79 : '미'
그 이하 : '좀 더 노력해'를 출력하는 익명블록 작성
ACCEPT P_SCORE PROMPT '점수 입력(0-100) : '
DECLARE
V_SCORE NUMBER := TO_NUMBER('&P_SCORE');
V_JUM NUMBER := TRUNC(V_SCORE/10);
BEGIN
CASE V_JUM WHEN 10 THEN
DBMS_OUTPUT.PUT_LINE(V_SCORE||'-> 수');
WHEN 9 THEN
DBMS_OUTPUT.PUT_LINE(V_SCORE||'-> 수');
WHEN 8 THEN
DBMS_OUTPUT.PUT_LINE(V_SCORE||'-> 우');
WHEN 7 THEN
DBMS_OUTPUT.PUT_LINE(V_SCORE||'-> 미');
ELSE
DBMS_OUTPUT.PUT_LINE(V_SCORE||'-> 좀 더 노력해');
END CASE;
END;
1._IF.sql
0.00MB
'데이터베이스 > ORACLE' 카테고리의 다른 글
28. TRIGGER (0) | 2021.03.17 |
---|---|
27. 분기문 ( LOOP, WHILE, FOR ) / CURSOR (0) | 2021.03.17 |
25. PL SQL (0) | 2021.03.17 |
24. SUB QUERY (0) | 2021.03.16 |
23. OUTER JOIN (0) | 2021.03.16 |