본문 바로가기
🖥Web/🔥DB & SQL

[Sql] SQL Cursor

by 후눅스 2020. 3. 20.
반응형

 

SQL에는 내부적으로 DBMS라는 애가 산다. 매니저 역할을 한다.

파싱하고 

 

순서는

open cursor fetch = true => RAM에 올린다.

 

그리고 닫아주어야한다 close

 

옵티마이저가일을 해준다.

하단의 Explain Plan(Ctrl + E)에 들어가면 옵티마이저가 할일 또는 하는일을 볼 수 있다.

 

 CREATE OR REPLACE PROCEDURE Implicit_Cursor 
        (p_empno IN emp.empno%TYPE) 
    IS 
        v_sal  emp.sal%TYPE; 
        v_update_row NUMBER; 
    BEGIN 
        SELECT sal 
        INTO v_sal 
        FROM emp 
        WHERE empno = p_empno; 
        -- 검색된 데이터가 있을경우 
        IF  SQL%FOUND THEN      
            DBMS_OUTPUT.PUT_LINE('검색한 데이터가 존재합니다 : '||v_sal);

        END IF; 
        UPDATE emp 
        SET sal = sal*1.1 
        WHERE empno = p_empno; 
        -- 수정한 데이터의 카운트를 변수에 저장 
        v_update_row := SQL%ROWCOUNT; 
        DBMS_OUTPUT.PUT_LINE('급여가 인상된 사원 수 : '|| v_update_row); 
        EXCEPTION     
           WHEN   NO_DATA_FOUND  THEN   
           DBMS_OUTPUT.PUT_LINE(' 검색한 데이터가 없네요... '); 
END;

 

 

 

CREATE OR REPLACE PROCEDURE proc_emp_update2(p_deptno IN NUMBER) 
IS 
    v_rate number; 
    v_empno number; 
    v_ename varchar2(100); 
    v_sal number; 
    avg_sal number; 
    CURSOR emp_cur IS 
    SELECT empno, ename, sal FROM emp 
     WHERE deptno = p_deptno; 
BEGIN 
 DBMS_OUTPUT.PUT_LINE('커서활용'); 
    SELECT avg(sal) INTO avg_sal 
      FROM emp 
     WHERE deptno = p_deptno; 
    OPEN emp_cur; 
        LOOP 
            FETCH emp_cur INTO v_empno, v_ename, v_sal; 
            EXIT WHEN emp_cur%NOTFOUND; 
             
            IF v_sal > avg_sal THEN 
                v_rate:=1.1; 
            ELSE 
                v_rate:=1.2; 
            END IF; 
            UPDATE emp SET sal = sal*v_rate 
            WHERE empno = v_empno; 
            DBMS_OUTPUT.PUT_LINE(v_ename||'사원의 '||v_sal||'이 '||v_rate||'인상으로'||v_sal*v_rate||'가 되었다.'); 
             
            END LOOP; 
        CLOSE emp_cur; 
END;
반응형