오라클에서 커서란 특정한 SQL영역을 가리키는 핸들러(한 개 또는 여러 개의 ROW를 가지는
SQL명령에 대한 work area) 정도로 보시면 되는데 우리가 작성하는 SQL문장은 모두 명시적이든 묵시적이든 커서를 가진다고 보시면 됩니다.
커서에 대한 자세한 설명은 오라클 강좌를 참고 하시기 바랍니다.
예를
들어 “select ename, sal from
emp”와 같은 SQL문장의 실행 결과를
여러분들의 프로그램에서 받아 낼 수가 있는 것 입니다.
구로디지털단지역 오엔제이프로그래밍 실무교육센터
(Java , Oracle, SQL, Oracle Tuning, BackUP& Recovery, ASP.NET,
C#, C#Network ,채용확정 무상교육)
www.onjprogramming.co.kr
www.onjprogramming.co.kr
아래에
그 예문을 소개하니 참고 바랍니다.
1. 커서 변수를 사용하기 위해서는 REF CURCOR TYPE을 이용해야 하므로
간단히 package를 하나 만듭니다.
SQL> CREATE OR REPLACE PACKAGE
types
2 AS
3 TYPE ref_cursor IS REF
CURSOR;
4 END;
5 /
패키지가 생성되었습니다.
2. 이렇게 함으로서 stored function에서 REF
CURSOR TYPE을 return 하게 만든 후
JDBC를 이용해 SELECT 리스트를 리턴 받을 수 있습니다. 이번에는 Stored Procedure를 하나 만듭니다.
SQL> CREATE OR REPLACE FUNCTION
sp_get_emp(v_deptno IN NUMBER)
2 RETURN
types.ref_cursor
3 AS
4 emp_cursor
types.ref_cursor;
5
BEGIN
6 OPEN emp_cursor
FOR
7 SELECT ename, sal FROM
emp
8 WHERE deptno =
v_deptno;
9
10
RETURN emp_cursor;
11
END;
12
/
함수가 생성되었습니다.
3. 다음과 같이 SQL*Plus에서 우선 결과를 확인 해 봅니다.
SQL> var results
refcursor
SQL> exec :results :=
sp_get_emp(10)
PL/SQL 처리가 정상적으로 완료되었습니다.
SQL> print
results
ENAME SAL
----------
----------
CLARK
2450
KING 5000
MILLER
1300
4. 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
sp_get_emp(?)}";
// 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") + " ");
out.println(rs.getString("sal") +
"<br>");
}
}
catch(Throwable e)
{
out.println(e);
}
finally {
try
{
rs.close();
cstmt.close();
conn.close();
}
catch(Exception e)
{}
}
%>
5. 결과
CLARK
2450
KING 5000
MILLER 1300
KING 5000
MILLER 1300
댓글 없음:
댓글 쓰기