커서는 특정한 SQL영역을 가리키는 핸들 정도로 생각하시면 되구요...
Oracle Server에 의해 실행되는 모든 SQL문은 연관된 각각의 커서를 소유 합니다.
그래서 커서는 암시적 커서(모든 DML과 PL/SQL SELECT문에 대해 선언)와 명시적커서
(프로그래머에 의해 선언되며 이름이 있는 커서)로 구분 할 수 있습니다.
명시적 커서를 다루기 위해서는 4가지 정도의 Step이 필요 합니다.
Cursor Operation Step
1. DECLARE //커서를 선언
2. OPEN //뚜껑을 열어야 사용 하겠죠...
3. FETCH //하나씩 꺼냅니다.
4. CLOSE //다 쓰고 나면 뚜껑을 닫습니다.
CURSOR c_emp_salary IS
SELECT last_name, salary FROM s_emp
WHERE dept_id = p_dept_id;
……
BEGIN
OPEN c_emp_salary ;
LOOP
FETCH c_emp_salary INTO v_last_name, v_sal ;
IF c_emp_salary %NOTFOUND THEN --나가기 위한 조건
EXIT;
END IF;
…….
END LOOP;
CLOSE c_emp_sal;
……
그럼 하나씩 보도록 하죠~~
1. 선언하기
문법 : DECLARE CURSOR 커서이름 IS select_statement;
사용되기 전에 선언하며 선언된 커서는 이름이 할당되고 SELECT문과 연결 됩니다.
SELECT문의 INTO절은 생략합니다.
Oracle PL/SQL 블록의 선언부에 위치하며 커서 내의 SELECT문에 Default 값을 사용할 수 도 있습니다.
2, 커서 열기
OPEN 커서이름 ;
3. 커서로 부터 데이터 패치
추출되는 컬럼의 수와 변수의 수 또는 데이터 타입은 동일 해야 합니다.
FETCH 커서이름 INTO 변수1, 변수2;
4. 커서 닫기
항상 닫아 주어야 합니다.
CLOSE 커서이름;
----
예)
----
SQL> ed p3
CREATE OR REPLACE PROCEDURE p_emp_info
(p_dept_id s_emp.dept_id%TYPE)
IS
CURSOR c_emp_sal IS
SELECT last_name, salary
FROM s_emp
WHERE dept_id = p_dept_id;
v_sal s_emp.salary%TYPE;
v_last_name s_emp.last_name%TYPE;
BEGIN
OPEN c_emp_sal;
LOOP
FETCH c_emp_sal INTO v_last_name, v_sal ;
IF c_emp_sal%NOTFOUND THEN
EXIT;
END IF;
DBMS_OUTPUT.PUT_LINE(v_last_name || ' ' || v_sal);
END LOOP;
CLOSE c_emp_sal;
END;
/
SQL> @p3
SQL> EXEC p_emp_info(31);
Oracle Server에 의해 실행되는 모든 SQL문은 연관된 각각의 커서를 소유 합니다.
그래서 커서는 암시적 커서(모든 DML과 PL/SQL SELECT문에 대해 선언)와 명시적커서
(프로그래머에 의해 선언되며 이름이 있는 커서)로 구분 할 수 있습니다.
명시적 커서를 다루기 위해서는 4가지 정도의 Step이 필요 합니다.
Cursor Operation Step
1. DECLARE //커서를 선언
2. OPEN //뚜껑을 열어야 사용 하겠죠...
3. FETCH //하나씩 꺼냅니다.
4. CLOSE //다 쓰고 나면 뚜껑을 닫습니다.
CURSOR c_emp_salary IS
SELECT last_name, salary FROM s_emp
WHERE dept_id = p_dept_id;
……
BEGIN
OPEN c_emp_salary ;
LOOP
FETCH c_emp_salary INTO v_last_name, v_sal ;
IF c_emp_salary %NOTFOUND THEN --나가기 위한 조건
EXIT;
END IF;
…….
END LOOP;
CLOSE c_emp_sal;
……
그럼 하나씩 보도록 하죠~~
1. 선언하기
문법 : DECLARE CURSOR 커서이름 IS select_statement;
사용되기 전에 선언하며 선언된 커서는 이름이 할당되고 SELECT문과 연결 됩니다.
SELECT문의 INTO절은 생략합니다.
Oracle PL/SQL 블록의 선언부에 위치하며 커서 내의 SELECT문에 Default 값을 사용할 수 도 있습니다.
2, 커서 열기
OPEN 커서이름 ;
3. 커서로 부터 데이터 패치
추출되는 컬럼의 수와 변수의 수 또는 데이터 타입은 동일 해야 합니다.
FETCH 커서이름 INTO 변수1, 변수2;
4. 커서 닫기
항상 닫아 주어야 합니다.
CLOSE 커서이름;
----
예)
----
SQL> ed p3
CREATE OR REPLACE PROCEDURE p_emp_info
(p_dept_id s_emp.dept_id%TYPE)
IS
CURSOR c_emp_sal IS
SELECT last_name, salary
FROM s_emp
WHERE dept_id = p_dept_id;
v_sal s_emp.salary%TYPE;
v_last_name s_emp.last_name%TYPE;
BEGIN
OPEN c_emp_sal;
LOOP
FETCH c_emp_sal INTO v_last_name, v_sal ;
IF c_emp_sal%NOTFOUND THEN
EXIT;
END IF;
DBMS_OUTPUT.PUT_LINE(v_last_name || ' ' || v_sal);
END LOOP;
CLOSE c_emp_sal;
END;
/
SQL> @p3
SQL> EXEC p_emp_info(31);
기업100%환급/오라클/자바/스프링/안드로이드/닷넷C#/웹퍼블리싱… | 12-27 | 2122 | ||
[채용예정교육]오라클자바개발잘하는신입뽑기2개월과정,교육전취… | 12-11 | 1532 | ||
53 | [평일주간]100%환급6건,안드로이드,자바,C#,스프링3.2,SQL,힌트/… | 03-15 | 1305 | |
52 | [기업100%환급]C#4.0,WinForm,ADO.NET프로그래밍 | 01-31 | 1444 | |
51 | [평일,기업100%환급]SQL기초에서 Schema Object까지 | 01-31 | 1448 | |
50 | [기업100%환급]Spring ,MyBatis,Hibernate실무과정(스프링개발자… | 01-31 | 1128 | |
49 | [평일주간,평일야간,주말]Spring,MyBatis,Hibernate개발자과정 | 01-19 | 1446 | |
48 | [평일주간,평일야간,주말]안드로이드개발자과정 | 01-11 | 1275 | |
47 | [평일야간,주말주간,주말야간]JAVA,Network&JSP&Spring,MyBatis,… | 01-03 | 1775 | |
46 | 기업100%환급/오라클/자바/스프링/안드로이드/닷넷C#/웹퍼블리싱… | 12-27 | 2122 | |
45 | [기업100%환급,평일주간]자바기초에서 JDBC, Servlet/JSP까지 | 12-19 | 1536 | |
44 | [평일야간, 주말]웹퍼블리싱 마스터(HTML5,CSS3,jQUERY,AJAX,Jav… | 12-14 | 1513 | |
43 | [채용예정교육]오라클자바개발잘하는신입뽑기2개월과정,교육전취… | 12-11 | 1532 | |
42 | [평일,기업100%환급]자바기초에서 JDBC, Servlet/JSP까지 | 12-09 | 1217 | |
41 | [평일야간, 주말]닷넷(C#,Network,ADO.NET,ASP.NET)마스터 | 12-01 | 1448 | |
40 | [기업100%환급]안드로이드개발자과정(Android전액환급교육) | 12-01 | 1587 | |
39 | [평일야간,주말]SQL기초에서실무까지(SQL기초,PLSQL,힌트,튜닝) | 12-01 | 1100 |
댓글 없음:
댓글 쓰기