반응형
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;
반응형
'🖥Web > 🔥DB & SQL' 카테고리의 다른 글
[DB & SQL] 데이터 모델링의 이해 / 데이터 모델링의 이해 (0) | 2022.05.09 |
---|---|
[Sql] Tablespace(테이블스페이스)란? (0) | 2020.06.07 |
[SQL] SQL의 예외처리 (0) | 2020.03.20 |
[SQL] 프로시저(procedure)와 declare 차이 (0) | 2020.03.20 |
[SQL] 프로토콜에서 procedure 생성 (0) | 2020.03.17 |