2020년 7월 19일 일요일

오라클 명시적 커서(Explicit Cursor)

오라클 명시적 커서(Explicit Cursor)

http://ojc.asia/bbs/board.php?bo_table=LecSQLnPlSql&wr_id=575

5.3 명시적 커서(Explicit Cursor)

n 멀티 로우를 SELECT 하기위해 사용한다.

n 선언(Declaring) : Declare 섹션에서 정의한다. 메모리 초기화 단계이며 커서에 이름을 부여하고 SELECT문장을 정의하며, SELECT문에는 INTO 절이 필요없다.

CURSOR c_emp IS SELECT * FROM emp;

n 오픈(Opening) : SQL문장을 실행하고 커서를 위한 메모리를 할당하며 BEGIN 절에서 실행한다. 커서는 SELECT된 데이터(Active Set)의 첫번째 레코드에 포인터가 위치하고 패치단계에서 사용할 수 있게 된다. OPEN시 실행되는 SQL문장에서 추출되는 레코드가 없더라도 오류가 발생하지 않고 데이터가 없다는 것은 이후 FETCH를 마친 후 커서 속성값을 통해 판단 할 수 있다.(%FOUND)

OPEN c_emp;

n 패치(Fetching) : 데이터 추출단계이며 FETCH되는 레코드가 없더라도 오류가 발생하지 않는다. INTO절 다음에 오는 칼럼 리스트는 SELECT시 정의한 칼럼 리스트와 개수, 타입이 동일해야 한다. “SELECT *” 등으로 커서를 만들었다면 %ROWTYPE을 적절히 이용하면 된다.

FETCH c_emp INTO c_emp_record;

n 종료(Closing) : 커서 Closing

CLOSE c_emp;

[명시적 커서의 속성]

커서이름%ISOPEN : 커서가 오픈되었으면 TRUE

커서이름%FOUND : FETCH했는데 레코드가 있었으면 TRUE

커서이름%NOTFOUND : FETCH했는데 레코드가 없었으면 TRUE

커서이름%ROWCOUNT : 지금까지 FETCH한 데이터 건수

SQL> SET SERVEROUTPUT ON

SQL> DECLARE

CURSOR c_emp IS

SELECT ename, sal FROM emp WHERE deptno = 10;

v_ename emp.ename%TYPE;

v_sal emp.sal%TYPE;

BEGIN

OPEN c_emp;

LOOP

FETCH c_emp INTO v_ename, v_sal;

EXIT WHEN c_emp%NOTFOUND OR c_emp%NOTFOUND IS NULL;

DBMS_OUTPUT.PUT_LINE(c_emp%ROWCOUNT || '. ' || v_ename || ',' || v_sal);

END LOOP;

CLOSE c_emp;

END;

/

1. CLARK,2837

2. KING,5789

3. MILLER,1505

-- CURSOR FOR LOOP는 커서의 레코드를 알아서 다 처리해주므로 EXIT WHEN이 필요없다

-- 알아서 OPEN하고 알아서 FETCH, Closing 한다. 즉 선언만 하여 사용하면 된다.

SQL> DECLARE

CURSOR c_emp IS

SELECT ename, sal FROM emp WHERE deptno = 10;

BEGIN

FOR emp_record IN c_emp LOOP

DBMS_OUTPUT.PUT_LINE(c_emp%ROWCOUNT || '. '

|| emp_record.ename || ',' || emp_record.sal);

END LOOP;

END;

/

1. CLARK,2837

2. KING,5789

3. MILLER,1505

-- 아래와 같이 커서 정의를 CURSOR FOR LOOP헤더에서 해도 된다.

-- 물론 커서이름이 없으니 커서의 속성은 사용하지 못한다.

SQL> DECLARE

BEGIN

FOR emp_record IN (SELECT ename, sal FROM emp WHERE deptno = 10) LOOP

DBMS_OUTPUT.PUT_LINE(emp_record.ename || ',' || emp_record.sal);

END LOOP;

END;

/

CLARK,2837

KING,5789

MILLER,1505

오라클 묵시적커서(IMPLICIT CURSOR)

오라클 묵시적커서(IMPLICIT CURSOR)

http://ojc.asia/bbs/board.php?bo_table=LecSQLnPlSql&wr_id=574

5.2 묵시적 커서(Implicit Cursor)

n PL/SQL 내부에서 한건의 데이터만 SELECT되는 DML이 있다면 오라클이 자동으로 SQL이라는 이름의 묵시적 커서를 선언하여 사용하고 닫아 버린다.

n INSERT, UPDATE, DELETE가 실행될 때도 묵시적 커서가 생성되는데 INSERT인 경우 커서는 INSERT되는 데이터를 가리키며 UPDATE, DELETE가 실행되는 경우 커서는 DML에 의해 영향을 받는 레코드를 가리킨다.

n 가장 최근에 만들어진 묵시적 커서에 대한 속성을 제공한다.

Attribute

Description

%FOUND

SELECT, INSERT, UPDATE, DELETE에 의해 영향을 받은 레코드가 한건 이상이면 TRUE, 아니면 FALSE를 리턴.

%NOTFOUND

%FOUND의 반대, SELECT, INSERT, UPDATE, DELETE에 의해 영향을 받은 레코드가 한건도 없으면 TRUE, 아니면 FALSE를 리턴.

%ISOPEN

항상 FALSE, 묵시적 커서는 오라클 서버가 항상 사용 후 Closing.

%ROWCOUNT

SELECT, INSERT, UPDATE, DELETE에 의해 영향을 받은 레코드 건수를 리턴.

SQL> select ename, sal from emp where deptno = 10;

ENAME SAL

---------- ----------

CLARK 2450

KING 5000

MILLER 1300

-- EMP 테이블에서 10번 부서 사원들의 급여를 5% 인상 하시오.

SQL> SET SERVEROUTPUT ON

SQL> DECLARE

total_rows number(2);

BEGIN

UPDATE emp

SET sal = sal + round(sal * 5 / 100)

WHERE deptno = 10;

IF sql%notfound THEN

dbms_output.put_line('no emp selected');

ELSIF sql%found THEN

total_rows := sql%rowcount;

dbms_output.put_line( total_rows || ' emps updated ');

END IF;

commit; --커밋해버리면 커서의 속성을 알수 없으니 뒤쪽에서 Commit

END;

/

3 emps updated

PL/SQL 처리가 정상적으로 완료되었습니다.

SQL> select ename, sal from emp where deptno = 10;

ENAME SAL

---------- ----------

CLARK 2573

KING 5250

MILLER 1365

오라클 PLSQL Cursor(커서)

5. PL/SQL Cursor(커서)

n 커서는 SELECT 또는 DML(Insert/Update/Delete/Merge) 조작시 클라이언트 프로세스에서 참조하는 PGA또는 SGA의 Library Cache내 전용 SQL 영역(Private SQL Area, Context Area)을 가리키는 포인터 또는 핸들 이다.

n Private SQL Area, Context Area에는 SQL문 처리를 위한 모든 정보(처리된 로우 카운드 등)들을 담고 있고 또한 커서는 SQL 명령으로 리턴되는 하나 또는 그이상의 ROW를 포함하고 있으며 이를 Active Set이라 하고 Active Set의 처음 로우를 기본적으로 가리키고 있다.

n DML에서 커서 관리는 오라클 서버에서 알아서 하지만 오라클 PL/SQL에서는 SELECT 명령에 대해 커서를 조작하는 몇가지 방법을 제공한다.

n SQL 커서는 오라클 서버 운영모드가 Dedicate Server 환경이면 PGA, MTS(MultiThreaded Server) 환경이면 SGA의 Library Cache에 위치한다.

n 묵시적 커서는 오라클 서버의 모든 SQL에 대해 자동으로 만들어지는 커서를 말한다.

n 명시적 커서는 PL/SQL을 작성하는 개발자가 명시적으로 Declare절에 선언하여 사용하는 커서이며 다중행을 다룰 때 사용한다.

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...