일반 Cursor와 Ref Cursor 차이점
일반적인 명시적, 묵시적 커서와 Ref Cursor의 차이는 다음과 같다.
1. 일반 커서는 정적, 커서가 한번 SQL 영역을 가리키면 가리키는 곳을 변경 못함, Ref Cursor는 가능하다.
Declare
Type refcur is ref cursor;
cursor c is select * from dual;
myCursor refCur;
begin
//myCur는 ref cursor
if (to_char(sysdate,’dd’) = 30) then
open myCur for select * from emp;
elsif ((to_char(sysdate,’dd’) = 20) then
open myCur for select * from dept;
end if;
open c; //일반커서
end;
/
2. 커서의 값을 클라이언트로 보낼 수 있는냐의 차이.
일반 커서가 가리키는 값은 함수나 프러시저를 호출한 곳으로 레코드를 보낼 수 없지만 Ref Cursor는 가능하다.
다음 예제를 이해하자.
SQL> CREATE or REPLACE PACKAGE TYPES
2 AS
3 Type cursorType IS Ref Cursor;
4 end;
5 /
패키지가 생성되었습니다.
.
아래는 테스트용 Function 입니다. EMP 테이블의 데이터 중 인자로 넘기는 부서에 해당 하는 데이터만 리턴 합니다…
SQL> CREATE OR REPLACE FUNCTION emptest(v_deptno in number) RETURN TYPES.CURSORTYPE
2 AS
3 test_cursor TYPES.CURSORTYPE;
4 sql_string Varchar2(500);
5 BEGIN
6 sql_string := 'Select * from scott.Emp where deptno = :deptno' ;
7 Open test_cursor FOR sql_string USING v_deptno;
8 RETURN test_cursor;
9 CLOSE test_Cursor;
10 END;
11 /
함수가 생성되었습니다.
한가지 더,,, 위 함수를 다음과 같이 USING문을 이용하지 않고도 가능 합니다.
CREATE OR REPLACE FUNCTION emptest(v_deptno in number) RETURN TYPES.CURSORTYPE
AS
test_cursor TYPES.CURSORTYPE;
sql_string Varchar2(500);
BEGIN
sql_string := 'Select * from scott.Emp where deptno = ' || v_deptno;
Open test_cursor FOR sql_string;
RETURN test_cursor;
CLOSE test_Cursor;
END;
/
자 그럼 이젠 JSP 프로그램을 간단히 만들어 TEST 해 봅시다…
//test.jsp
<%@ page language="java" contentType="text/html; charset=euc-kr" %>
<%@ page import="java.sql.*,oracle.jdbc.driver.* " %>
<%
Connection conn = null;
CallableStatement cstmt = null;
ResultSet rs = null;
String driver_name = "oracle.jdbc.driver.OracleDriver"; //오라클 드라이버
String url = "jdbc:oracle:thin:@localhost:1521:wink"; //호스트
String user = "scott"; //계정
String pwd = "tiger"; //비밀번호
String query = "";
try {
Class.forName(driver_name); //jdbc 드라이버연결
conn = DriverManager.getConnection(url,user,pwd); //Connection인수 입력
String proc_call = "{? = call emptest(?)}";
// create callable statement
cstmt = conn.prepareCall(proc_call);
// key here is to register the output parameter
// of type cursor, execute, then cast it as a ResultSet.
cstmt.registerOutParameter(1, OracleTypes.CURSOR);
cstmt.setInt(2, 10); //10번 부서의 데이터만 얻기 위해
cstmt.executeQuery();
rs = (ResultSet)cstmt.getObject(1);
while(rs.next()) {
out.println(rs.getString("ename") + "<br>");
}
}
catch(Throwable e)
{
out.println(e);
}
finally {
try {
rs.close();
cstmt.close();
conn.close();
}
catch(Exception e) {}
}
%>
전 DocumentRoot에 두고 http://localhost/test.jsp 라고 실행을 했습니다.
[결과]
CLARK
KING
MILLER
====================================================
[오프라인 개강예정강좌, 오프라인교육장에 오시면 보다 자세히 배울 수 있습니다.]
오라클자바커뮤니티에서 운영하는 개발자 전문교육 ,개인80%환급(www.onjprogramming.co.kr)
[주간]
[01/06][기업100%환급]Spring ,MyBatis,Hibernate실무과정
[01/06][기업100%환급]SQL기초에서 Schema Object까지
[01/06]C#,ASP.NET마스터
[01/13]iPhone 하이브리드 앱 개발 실무과정
[01/13][기업100%환급]PL/SQL,ORACLE HINT,TUNING
[01/13][기업100%환급]자바기초에서 JDBC, Servlet/JSP까지
[01/13][기업100%환급]HTML5,JavaScript,Ajax,jQUERY,JSON
[01/16][채용확정]오라클자바실무개발자신입과정
[평일야간]
[01/07]자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
[01/07]안드로이드개발자과정
[01/08]C#,ASP.NET마스터
[01/09]iPhone하이브리드앱개발실무과정
[01/09]웹퍼블리싱 마스터
[01/09]Spring3.X, MyBatis, Hibernate실무과정
[01/24]SQL초보에서실전전문가까지
[주말]
[01/04]닷넷실무자를위한WPF개발자과정
[01/04]Spring3.X,MyBatis,Hibernate실무과정
[01/11]C#,ASP.NET마스터
[01/11]JAVA&WEB프레임워크실무과정
[01/11]안드로이드개발자과정
[01/11]SQL초보에서전문가까지
[01/18]웹퍼블리싱 마스터
오라클자바커뮤니티에서 운영하는 개발자 전문교육 ,개인80%환급(www.onjprogramming.co.kr)
[주간]
[01/06][기업100%환급]Spring ,MyBatis,Hibernate실무과정
[01/06][기업100%환급]SQL기초에서 Schema Object까지
[01/06]C#,ASP.NET마스터
[01/13]iPhone 하이브리드 앱 개발 실무과정
[01/13][기업100%환급]PL/SQL,ORACLE HINT,TUNING
[01/13][기업100%환급]자바기초에서 JDBC, Servlet/JSP까지
[01/13][기업100%환급]HTML5,JavaScript,Ajax,jQUERY,JSON
[01/16][채용확정]오라클자바실무개발자신입과정
[평일야간]
[01/07]자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
[01/07]안드로이드개발자과정
[01/08]C#,ASP.NET마스터
[01/09]iPhone하이브리드앱개발실무과정
[01/09]웹퍼블리싱 마스터
[01/09]Spring3.X, MyBatis, Hibernate실무과정
[01/24]SQL초보에서실전전문가까지
[주말]
[01/04]닷넷실무자를위한WPF개발자과정
[01/04]Spring3.X,MyBatis,Hibernate실무과정
[01/11]C#,ASP.NET마스터
[01/11]JAVA&WEB프레임워크실무과정
[01/11]안드로이드개발자과정
[01/11]SQL초보에서전문가까지
[01/18]웹퍼블리싱 마스터
홈페이지 바로가기 : http://www.oraclejavanew.kr
댓글 없음:
댓글 쓰기