SET SERVEROUTPUT ON
DECLARE
ENO NUMBER(4);
DNAME VARCHAR2(10);
ESAL NUMBER(7);
CURSOR C1 --커서 선언
IS
SELECT EMPNO,ENAME,SAL FROM EMP WHERE DEPTNO=10;
BEGIN
OPEN C1 --커서 오픈
LOOP
FETCH C1 INTO ENO,ENAME,ESAL; --커서에서 추출한 결과 변수에 저장하기
EXIT WHEN C1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(ENO||' '||ENAME||' '||ESAL);
END LOOP;
CLOSE C1; --커서 닫기
END;
/
결과
7782 CLARK 2450
7839 KING 5000
7934 MILLER 1300
2000 이씨 1000
예2) 모든 사원번호,사원이름,급여,급여가3000이상이면 높음,2000이상이면 보통, 2000미만이면 낮음을 출력하세요.
Q1) 커서를 사용해서 모든 사원의 이름,급여,전체사원의 급여합을 구해서 출력해 보세요.
예3) 각 부서의 급여합 구하기
DECLARE
Q2) 커서를 사용해서 모든 사원번호,이름,부서명,급여,보너스,부서번호를 출력하는 프로시져를 만들고 사용해 보세요. 보너스는 부서번호가 10번이면 급여의 10%, 부서번호가 20번이면 급여의 20%, 부서번호가 30번이면 급여의 30%
예) 직업이 'ANALIST'이면 급여의 10%, 직업이 'CLERK'이면 급여의 20%, 직업이 'SALESMAN'이면 급여의 30% 가 보너스로 지급된다. 사원번호,직업,급여,보너스를 구해서 출력해 보세요.
SQL> SELECT EMPNO
,JOB
,SAL
,DECODE(JOB,
'ANALIST',SAL*0.1,
'CLERK',SAL*0.2,
'SALESMAN',SAL*0.3,
SAL) AS BONUS
FROM EMP;
EMPNO JOB SAL BONUS
---------- ------------------ ---------- ----------
7369 CLERK 800 160
7499 SALESMAN 1600 480
7521 SALESMAN 1250 375
7566 MANAGER 2975 2975
7654 SALESMAN 1250 375
7698 MANAGER 2850 2850
2) CASE WHEN 조건1 THEN 결과값1
WHEN 조건2 THEN 결과값2
WHEN 조건3 THEN 결과값3
..
ELSE 기본값
END 별칭;
예) 각 부서별 평균급여를 구하고 평균급여가 3000이상이면 높음, 2000이상이면 보통,1000이하이면 낮음을 출력하시오.
SELECT DEPTNO,AVG(SAL),
CASE WHEN AVG(SAL)>=3000 THEN '높음'
WHEN AVG(SAL)>=2000 THEN '보통'
WHEN AVG(SAL)>=1000 THEN '낮음'
ELSE '판단불가'
END "평가"
FROM EMP
GROUP BY DEPTNO;
DEPTNO AVG(SAL) 평가
--------- ---------- ------------
30 1566.66667 낮음
20 2258.33333 보통
10 2916.66667 보통