2014년 2월 2일 일요일

[오라클 PLSQL 커서란]일반 Cursor와 Ref Cursor 차이점, 오라클교육,PLSQL교육,구로디지털단지,오라클교육학원

[오라클 PLSQL 커서란]일반 Cursor와 Ref Cursor 차이점, 오라클교육,PLSQL교육,구로디지털단지,오라클교육학원


일반적인 명시적, 묵시적 커서와 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



댓글 없음:

댓글 쓰기