2014년 6월 24일 화요일

오라클SQL교육강좌학원,쿼리학원,SQL교육,일반 Cursor와 Ref Cursor 차이점

오라클SQL교육강좌학원,쿼리학원,SQL교육,일반 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.oraclejavacommunity.com


평일주간(9:30~18:10) 개강
(6/30)[기업100%환급]PL/SQL,ORACLE HINT,TUNING
(6/30)[기업100%환급]안드로이드개발자과정
(6/30)[기업100%환급]SQL기초에서 Schema Object까지
(7/07)[기업100%환급]C#4.0,WinForm,ADO.NET프로그래밍
(7/07)[기업100%환급]Spring ,MyBatis,Hibernate실무과정
(7/07)[기업100%환급]자바기초에서 JDBC, Servlet/JSP까지
(7/07)[채용예정교육]오라클자바개발잘하는신입뽑기프로젝트,교육전취업확정

평일야간(19:00~21:50) 개강
(6/26)SQL초보에서실전전문가까지
(7/01)안드로이드개발자과정
(7/01)닷넷(C#,Network,ADO.NET,ASP.NET)마스터과정
(7/02)Spring3.X, MyBatis, Hibernate실무과정
(7/02)자바웹(JSP,Spring,MyBatis,XPlatform)프로젝트과정
(7/02)JAVA,Network&WEB&Framework(자바기초에서웹스프링까지)
(7/03)웹퍼블리싱 마스터
(7/15)MyBatis3.X, Hibernate4.X ORM실무과정
(7/22)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지

주말(10:00~17:50) 개강
(6/28)Spring3.X, MyBatis, Hibernate실무과정
(6/28)안드로이드개발자과정
(6/28)실무예제로 배워보는 jQuery(개발자/디자이너를위한)
(6/28)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
(7/05)SQL초보에서 Schema Object까지
(7/12)자바웹(JSP,Spring,MyBatis,XPlatform)프로젝트과정
(7/12)MyBatis3.X, Hibernate4.X ORM실무과정
(7/12)개발자를위한PLSQL,SQL튜닝,힌트
(7/13)C#,ASP.NET마스터

주말저녁(18:30~22:20) 개강
(6/28)JAVA,Network&WEB&Framework
(6/28)SQL기초에서실무까지

댓글 없음:

댓글 쓰기