[PL/SQL] 커서(Cursor)

sleeee·2023년 5월 7일
0

SQL

목록 보기
17/19

커서(Cursor)

  • sql문을 실행할때마다 sql문 처리를 위한 메모리공간을 사용하는데 이를 접근하기 위해 커서를 사용한다.
  • 커서의 단계
    1) 커서 선언하기
    2) 커서 오픈하기
    3) 커서에서 추출한 결과 저장하기
    4) 커서닫기
    예1)
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%

  • 기타)
    1) DECODE(대상컬럼,
    조건1,결과값1,
    조건2,결과값2,
    ..,
    기본값) 별칭

예) 직업이 '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 보통
profile
개인 공부 기록 👩‍💻

0개의 댓글