본문 바로가기

Database/Oracle

pl//Cursor

컴퓨터의 표시 화면에서, 데이터의 입력·수정을 할 때의 위치 지정 및 기능 선택할 때 사용하는 마크.

 

 

 

 

 

 

--암시적 커서

* 암시적 커서 ( Implicit Cursor )

- 오라클 DB 에서 실행되는 모든 SQL문장은 암시적인 커서가 생성되며, 커서 속성을 사용할 수 있다.

- 모든 DML과 PL/SQL select 문에 대해 선언됨

- Oracle 서버에서 SQL문을 처리하기 위해 내부적으로 생성하고 관리한다.

- SQL 커서 속성을 사용하면 SQL 문의 결과를 테스트 할 수 있다.

- 암시적 커서는 SQL 문이 실행되는 순간 자동으로 OPEN과 CLOSE 를 실행 한다.

- 암시적 커서는 오라클이나 PL/SQL 실행 메커니즘에 의해 처리되는 SQL 문장이 처리되는 곳에 대한 익명의 주소다.

 

--수정하는 버전 (추출할 값이 여러개일경우)

CREATE OR REPLACE PROCEDURE implicit_cursor(p_empname IN employees.first_name%TYPE)
IS
    v_sal employees.salary%TYPE;          --v_sal은 salary타입
    v_update_row NUMBER;        --몇개의 행이 수정되는지 조사하는 부분의 변수
BEGIN
    --검색     : 검색되는 데이터는 한개 이상이면 에러가 발생
    SELECT salary INTO v_sal
    FROM employees
    WHERE first_name = p_empname;
    
    --검색된 데이터(row)가 있는 경우
    IF SQL%FOUND THEN            -- 찾았다
        dbms_output.put_line('검색된 데이터가 있습니다');
    END IF;
    
    --수정
    UPDATE employees
    SET salary = salary * 1.1
    WHERE first_name = p_empname;
    
    v_update_row := SQL%ROWCOUNT;           --업되이트 된 사원수 카운팅
    dbms_output.put_line('급여가 인상된 사원수 : ' || v_update_row);
    
EXCEPTION WHEN NO_DATA_FOUND THEN           --아무도 없을경우 예외처리
    dbms_output.put_line('검색된 데이터가 없습니다');

    
END;
/

 

EXEC implicit_cursor('Neena');

 

 

 

 

 

--검색버전

(검색되는 데이터가 한개 이상이면 에러가 발생, 수정할때는 상관없음)

 

CREATE OR REPLACE PROCEDURE implicit_cursor(p_empname IN employees.first_name%TYPE)
IS
    v_sal employees.salary%TYPE;          --v_sal은 salary타입
    v_update_row NUMBER;        --몇개의 행이 수정되는지 조사하는 부분의 변수
BEGIN
 /*   --검색     : 검색되는 데이터는 한개 이상이면 에러가 발생
    SELECT salary INTO v_sal
    FROM employees
    WHERE first_name = p_empname;
    
    --검색된 데이터(row)가 있는 경우
    IF SQL%FOUND THEN            -- 찾았다
        dbms_output.put_line('검색된 데이터가 있습니다');
    END IF;
  */  
    --수정
    UPDATE employees
    SET salary = salary * 1.1
    WHERE first_name = p_empname;
    
    v_update_row := SQL%ROWCOUNT;           --업되이트 된 사원수 카운팅
    dbms_output.put_line('급여가 인상된 사원수 : ' || v_update_row);
    
EXCEPTION WHEN NO_DATA_FOUND THEN           --아무도 없을경우 예외처리
    dbms_output.put_line('검색된 데이터가 없습니다');

    
END;
/

 

EXEC implicit_cursor('John');

John인 이름의 사람이 다수이므로 수정만 사용 가능

 

 

 

 

 

 

--명시적 커서 

--우리가 Object(Cursor)선언

 

 

* 명시적 커서 ( Explicit Cursor )

- 프로그래머에 의해 선언되며 이름이 있는 커서

* 명시적 커서 속성

- %ROWCOUNT : 현재까지 반환된 모든 행의 수를 출력

- %ISOPEN : 커서가 오픈되어 있으면 TRUE

 

CURSOR OPEN

CURSOR FETCH

CURSOR CLOSE

CREATE PROCEDURE expCursor_test(v_deptno IN departments.department_id%TYPE)--NUMBER로적어도 됨
IS
    CURSOR dept_avg
    IS
    SELECT d.department_name, COUNT(e.employee_id) CNT, ROUND(AVG(salary),3) SAL --찾을 값들 선언
    FROM employees e, departments d
    WHERE e.department_id = d.department_id
        AND e.department_id = v_deptno          --외부로부터 입력된 부서번호
    GROUP BY d.department_name;
    
    --CURSOR에 PATCH하기 위한 변수들을 선언.
    v_dname departments.department_name%TYPE;
    emp_cnt NUMBER;
    sal_avg NUMBER;             --3개의 값이 산출되는데 거기에 붙이기 위한 변수 선언
    
BEGIN
    
    --CURSOR OPEN
    OPEN dept_avg;              --커서에 붙인 데이터를 오픈
    
    --CURSOR FETCH
    FETCH dept_avg INTO v_dname, emp_cnt, sal_avg;  --나오는 값에 패치로 붙이고 취득
    
    dbms_output.put_line('부서명 : ' || v_dname);
    dbms_output.put_line('사원수 : ' || emp_cnt);
    dbms_output.put_line('평균 월급 : ' || sal_avg);

    --CURSOR CLOSE
    CLOSE dept_avg;
    
END;
/

--호출
EXEC expcursor_test(10); --10번부서 확인

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Database > Oracle' 카테고리의 다른 글

PL//Trigger  (0) 2020.06.29
PL// 함수  (0) 2020.06.29
PL// work 06  (0) 2020.06.26
PL 1  (0) 2020.06.26
work 06 (view)  (0) 2020.06.26