컴퓨터의 표시 화면에서, 데이터의 입력·수정을 할 때의 위치 지정 및 기능 선택할 때 사용하는 마크.
--암시적 커서
* 암시적 커서 ( 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 |