Oracle의 Stored Procedure/Function 이용하기 (CallableStatement)
==============================================
Oracle의 Stored Procedure/Function 이용하기
==============================================
CallableStatement
모든 DBMS들에 대한 표준방법으로 저장 프로시져(stored procedure)를 호출하는 방법을 제공한다.
두가지 형태중의 하나인 escape 문법으로 작성되어진다. 즉, 결과 매개변수를 가지는 형태와 결과 매개변수가 없는 형태
결과 매개변수를 리턴하는 프로시져를 위한 문법은 다음과 같다.:
{? = call procedure_name[(?, ?, ...)]} 매개변수가 없는 저장 프로시져를 위한 문법은 다음과 같을 것이다. :
{call procedure_name}
CallableStatement 객체는 Connection의 prepareCall 메쏘드에 의해 생성된다. 아래의 예제는 저장 프로시져 getTestData의 호출을 포함하는 CallableStatement의 인스턴스를 만든다. 이것은 두 개의 인자들을 가지고 있고 결과 매개변수는 없다.:
CallableStatement cstmt = con.prepareCall("{call getTestData(?, ?)}");
CallableStatement객체로 IN 매개변수를 넘겨주는 것은 PreparedStatement로부터 상속받은 setXXX 메쏘드이다. 넘겨질 값의 데이터형은 사용할 setXXX 메쏘드를 결정한다.(setFloat는 float 값을 넘겨준다.등등) 만약 저장 프로시져가 OUT 매개변수를 리턴한다면, 각 OUT 매개변수의 SQL형은 CallableStatement 객체를 실행할 수 있기 전에 등록되어져야 한다.(이것은 몇몇 DBMS들이 SQL형을 필요로 하기 때문에 필요하다.) SQL형을 등록하는 것은 registerOutParameter 메쏘드를 사용한다.
다음의 예제는 유일한 매개변수로 INOUT 매개변수를 가지고 있는 저장 프로시져 reviseTotal이 있다는 것을 가정한다. setByte 메쏘드는 매개변수를 25로 설정하며, 이것은 드라이버가 SQL TINYINT로써 데이터베이스에 전송할 것이다. 그런다음 registerOutParameter는 SQL TINYINT로써 매개변수를 등록한다. 저장 프로시져가 실행된 후에, 새로운 SQL TINYINT 값을 리턴하고, getByte 메쏘드는 이 새로운 값을 자바 byte로 검색할 것이다.
CallableStatement cstmt = con.prepareCall("{call reviseTotal(?)}");
cstmt.setByte(1, 25); cstmt.registerOutparameter(1, java.sql.Types.TINYINT); cstmt.executeUpdate(); byte x = cstmt.getByte(1);
------------------------------
CallableStatement 예제
------------------------------
/* Oracle Server에 작성된 Function */
function employ_age (v_name in employees.name%TYPE) return number
is
v_age number(3) := 0;
begin
select age into v_age from employees
where name = v_name;
return v_age;
exception
when no_data_found or too_many_rows then
return v_age;
end;
---------------
-----------------------
// storedprocedure.html
------------------------
<html>
<head><title>Stored Procedure Call Test </title></head>
<body>
<form name=myform action=/servlet/StoredProcedure method=get>
성명 : <input type=text name=name>
<input type=submit>
</form>
</body>
</html>
--------------------
StoredProcedure.java
--------------------
/* Oracle의 Stored Procedure를 JDBC로 이용하는 예제입니다. StoredProcedure.java*/
import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class StoredProcedure extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
Connection con = null;
Statement stmt = null;
res.setContentType("text/html; charset=euc-kr");
PrintWriter out = res.getWriter();
try {
// 오라클 드라이버를 Load 한다
Class.forName("oracle.jdbc.driver.OracleDriver");
// 데이타 베이스에 접속을 한다.
con = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:wink", "scott", "tiger");
// Statement object를 생성한다.
CallableStatement cstmt = con.prepareCall("{? = call employ_age(?) }");
//Stored Procedure의 input value의 setting및 output value의 type설정
cstmt.registerOutParameter(1,Types.INTEGER);
cstmt.setString(2, han(req.getParameter("name"))); //Procedure의 parameter setting
cstmt.execute(); //CallableStatement 실행
int age = cstmt.getInt(1);
out.println("요청하신 " + han(req.getParameter("name")) + " 님의 나이는 " + age + " 입니다.");
}
catch(ClassNotFoundException e) {
out.println("Couldn't load database driver: " + e.getMessage());
}
catch(SQLException e) {
out.println("SQLException caught: " + e.getMessage());
}
finally { // 언제나 데이타 베이스 연결을 종료한다.
try { if (con != null) con.close(); }
catch (SQLException ignored) { }
}
}
//한글변환 함수
public static String han(String Unicodestr) throws UnsupportedEncodingException {
if( Unicodestr == null)
return null;
return new String(Unicodestr.getBytes("8859_1"),"KSC5601");
}
}
Previous Article : 34. Log출력용 Class 만들기
Next Article : 32. ResultSetMetaData 인터페이스
==============================================
Oracle의 Stored Procedure/Function 이용하기
==============================================
CallableStatement
모든 DBMS들에 대한 표준방법으로 저장 프로시져(stored procedure)를 호출하는 방법을 제공한다.
두가지 형태중의 하나인 escape 문법으로 작성되어진다. 즉, 결과 매개변수를 가지는 형태와 결과 매개변수가 없는 형태
결과 매개변수를 리턴하는 프로시져를 위한 문법은 다음과 같다.:
{? = call procedure_name[(?, ?, ...)]} 매개변수가 없는 저장 프로시져를 위한 문법은 다음과 같을 것이다. :
{call procedure_name}
CallableStatement 객체는 Connection의 prepareCall 메쏘드에 의해 생성된다. 아래의 예제는 저장 프로시져 getTestData의 호출을 포함하는 CallableStatement의 인스턴스를 만든다. 이것은 두 개의 인자들을 가지고 있고 결과 매개변수는 없다.:
CallableStatement cstmt = con.prepareCall("{call getTestData(?, ?)}");
CallableStatement객체로 IN 매개변수를 넘겨주는 것은 PreparedStatement로부터 상속받은 setXXX 메쏘드이다. 넘겨질 값의 데이터형은 사용할 setXXX 메쏘드를 결정한다.(setFloat는 float 값을 넘겨준다.등등) 만약 저장 프로시져가 OUT 매개변수를 리턴한다면, 각 OUT 매개변수의 SQL형은 CallableStatement 객체를 실행할 수 있기 전에 등록되어져야 한다.(이것은 몇몇 DBMS들이 SQL형을 필요로 하기 때문에 필요하다.) SQL형을 등록하는 것은 registerOutParameter 메쏘드를 사용한다.
다음의 예제는 유일한 매개변수로 INOUT 매개변수를 가지고 있는 저장 프로시져 reviseTotal이 있다는 것을 가정한다. setByte 메쏘드는 매개변수를 25로 설정하며, 이것은 드라이버가 SQL TINYINT로써 데이터베이스에 전송할 것이다. 그런다음 registerOutParameter는 SQL TINYINT로써 매개변수를 등록한다. 저장 프로시져가 실행된 후에, 새로운 SQL TINYINT 값을 리턴하고, getByte 메쏘드는 이 새로운 값을 자바 byte로 검색할 것이다.
CallableStatement cstmt = con.prepareCall("{call reviseTotal(?)}");
cstmt.setByte(1, 25); cstmt.registerOutparameter(1, java.sql.Types.TINYINT); cstmt.executeUpdate(); byte x = cstmt.getByte(1);
------------------------------
CallableStatement 예제
------------------------------
/* Oracle Server에 작성된 Function */
function employ_age (v_name in employees.name%TYPE) return number
is
v_age number(3) := 0;
begin
select age into v_age from employees
where name = v_name;
return v_age;
exception
when no_data_found or too_many_rows then
return v_age;
end;
---------------
-----------------------
// storedprocedure.html
------------------------
<html>
<head><title>Stored Procedure Call Test </title></head>
<body>
<form name=myform action=/servlet/StoredProcedure method=get>
성명 : <input type=text name=name>
<input type=submit>
</form>
</body>
</html>
--------------------
StoredProcedure.java
--------------------
/* Oracle의 Stored Procedure를 JDBC로 이용하는 예제입니다. StoredProcedure.java*/
import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class StoredProcedure extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
Connection con = null;
Statement stmt = null;
res.setContentType("text/html; charset=euc-kr");
PrintWriter out = res.getWriter();
try {
// 오라클 드라이버를 Load 한다
Class.forName("oracle.jdbc.driver.OracleDriver");
// 데이타 베이스에 접속을 한다.
con = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:wink", "scott", "tiger");
// Statement object를 생성한다.
CallableStatement cstmt = con.prepareCall("{? = call employ_age(?) }");
//Stored Procedure의 input value의 setting및 output value의 type설정
cstmt.registerOutParameter(1,Types.INTEGER);
cstmt.setString(2, han(req.getParameter("name"))); //Procedure의 parameter setting
cstmt.execute(); //CallableStatement 실행
int age = cstmt.getInt(1);
out.println("요청하신 " + han(req.getParameter("name")) + " 님의 나이는 " + age + " 입니다.");
}
catch(ClassNotFoundException e) {
out.println("Couldn't load database driver: " + e.getMessage());
}
catch(SQLException e) {
out.println("SQLException caught: " + e.getMessage());
}
finally { // 언제나 데이타 베이스 연결을 종료한다.
try { if (con != null) con.close(); }
catch (SQLException ignored) { }
}
}
//한글변환 함수
public static String han(String Unicodestr) throws UnsupportedEncodingException {
if( Unicodestr == null)
return null;
return new String(Unicodestr.getBytes("8859_1"),"KSC5601");
}
}
Previous Article : 34. Log출력용 Class 만들기
Next Article : 32. ResultSetMetaData 인터페이스
기업100%환급/오라클/자바/스프링/안드로이드/닷넷C#/웹퍼블리싱… | 12-27 | 2250 | ||
[채용예정교육]오라클자바개발잘하는신입뽑기2개월과정,교육전취… | 12-11 | 1617 | ||
53 | [평일주간100%환급]Spring,JAVA,JSP,안드로이드,C#닷넷,SQL,튜닝… | 03-15 | 1411 | |
52 | [주말]C#,ASP.NET마스터 | 01-31 | 1530 | |
51 | [기업100%환급,평일주간]SQL기초에서스키마오브젝트,PLSQL,힌트… | 01-31 | 1768 | |
50 | [기업100%환급]개발자를위한스프링,마이바티스,하이버네이트(스… | 01-31 | 1219 | |
49 | [평일주간,평일야간,주말]Spring,MyBatis,Hibernate개발자과정 | 01-19 | 1512 | |
48 | [평일주간,평일야간,주말]안드로이드개발자과정 | 01-11 | 1343 | |
47 | [평일야간,주말주간,주말야간]JAVA,Network&JSP&Spring,MyBatis,… | 01-03 | 1879 | |
46 | 기업100%환급/오라클/자바/스프링/안드로이드/닷넷C#/웹퍼블리싱… | 12-27 | 2250 | |
45 | [기업100%환급]자바웹개발기초과정(JAVA,JDBC,JSP,Servlet,Aajx,… | 12-19 | 1617 | |
44 | [평일주간야간, 주말]웹퍼블리싱 마스터(HTML5,CSS3,jQUERY,AJAX… | 12-14 | 1588 | |
43 | [채용예정교육]오라클자바개발잘하는신입뽑기2개월과정,교육전취… | 12-11 | 1617 | |
42 | [주말주간]자바&웹,jQUERY,스프링프레임워크 | 12-09 | 1291 | |
41 | [평일야간]닷넷(C#,Network,ADO.NET,ASP.NET)마스터 | 12-01 | 1511 | |
40 | [기업100%환급]자바기초&안드로이드개발자과정(Android전액환급… | 12-01 | 1693 | |
39 | [평일야간,주말]SQL기초에서실무까지(SQL기초,PLSQL,힌트,튜닝) | 12-01 | 1162 |
댓글 없음:
댓글 쓰기