java程序調用存儲過程
PL/SQL子程序,很多情況下是給應用程序來調用的,所有我們要掌握使用其他編程語言來調用我們寫好的存儲過程。下面我們介紹下使用java調用Oracle的存儲過程。
準備代碼:
package com.mscncn.plsql.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBUtil {
static{
try {
Class.forName("oracle.jdbc.OracleDriver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConntection(){
Connection ct=null;
try {
ct = DriverManager.getConnection(
"jdbc:oracle:thin:@192.168.0.25:1521:oracle",
"scott",
"scott");
} catch (SQLException e) {
e.printStackTrace();
}
return ct;
}
}
create or replace package pro_pk is
type pager_cursor is ref cursor;
procedure add_dept(dept_no in number,dept_name in varchar2,location in varchar2);
procedure delete_dept(dept_no in number,num out number);
end pro_pk;
create or replace package body pro_pk is
procedure add_dept(dept_no in number,dept_name in varchar2,location in varchar2)
is
exp_remaining exception;
pragma exception_init(exp_remaining,-1);/*非預定義錯誤,-1是違反唯一約束*/
begin
insert into dept values(dept_no,dept_name,location);
if sql%found then /*隱式游標,sql*/
return 1;
else
return 0;
end if;
exception
when exp_remaining then
dbms_output.put_line('違反唯一約束.');
end add_dept;
procedure delete_dept(dept_no in number,num out number)
is
begin
delete from dept where deptno=dept_no;
if sql%found then
num:=1;
else
num:=1;
end if;
end delete_dept;
end pro_pk;create or replace package pageUtil is type page_cursor is ref cursor;--定義一個游標類型 procedure pager( tName in varchar2, --表名 pageNum in number, --頁數 pageSize in number,--每頁記錄數 totalRecord out number,--總記錄數 totalPage out number,--總頁數 p_cursor out page_cursor); end pageUtil; create or replace package body pageUtil is procedure pager( tName in varchar2, --表名 pageNum in number, --頁數 pageSize in number,--每頁記錄數 totalRecord out number,--總記錄數 totalPage out number,--總頁數 p_cursor out page_cursor) is --定義sql語句字符串 v_sql varchar2(1000); --分頁開始位置,與結束位置 v_begin number:=(pageNum-1)*pageSize+1; v_end number:=pageNum*pageSize; begin v_sql:='select * from ( select t.*,rownum rn from ' ||tName||' t where rownum<='||v_end||') where rn>='||v_begin; --把游標和sql關聯 dbms_output.put_line(v_sql); open p_cursor for v_sql; --計算totalRecord與totalPage v_sql:='select count(*) from '||tName; -- execute immediate v_sql into totalRecord; if mod(totalRecord,pageSize)=0 then totalPage:=totalRecord/pageSize; else totalPage:=totalRecord/pageSize+1; end if; --關閉游標,這兒需要注意,如果我們在java程序中使用cursor,那么就一定不能關閉cursor --否則關閉cursor后,java程序中返回的結果集就是null --close p_cursor; end pager; end pageUtil;
1. java調用沒有返回值的存儲過程。
/**
* java調用沒有返回值的存儲過程
*/
@Test
public void proNoReulstTest(){
Connection ct=DBUtil.getConntection();
try {
CallableStatement cs=ct.prepareCall("{call pro_pk.add_dept(?,?,?)}");
cs.setInt(1, 13);
cs.setString(2, "java開發部");
cs.setString(3, "中國信陽");
cs.execute();
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
ct.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
2. java程序調用有返回值的存儲過程
/**
* java調用有返回值的存儲過程(返回值類型為number)
*/
@Test
public void proHasReulstTest(){
Connection ct=DBUtil.getConntection();
try {
CallableStatement cs=ct.prepareCall("{call pro_pk.delete_dept(?,?)}");
cs.setInt(1, 13);
//注冊第二個參數為存儲過程的返回值
cs.registerOutParameter(2, OracleType.STYLE_INT);
cs.execute();
//通過參數的索引,來獲取存儲過程的返回值,索引從1開始
int num=cs.getInt(2);
System.out.println(num==1?"刪除成功":"刪除失敗");
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
ct.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
3. java程序調用存儲過程返回值為游標
/**
* 存儲過程返回一個游標
*/
@Test
public void proReturnCursorTest(){
Connection ct=DBUtil.getConntection();
try {
CallableStatement cs=ct.prepareCall("{call pageUtil.pager(?,?,?,?,?,?)}");
cs.setString(1, "emp");
cs.setInt(2, 2);
cs.setInt(3, 5);
cs.registerOutParameter(4, OracleTypes.NUMBER);
cs.registerOutParameter(5, OracleTypes.NUMBER);
cs.registerOutParameter(6, OracleTypes.CURSOR);
cs.execute();
//通過參數的索引,來獲取存儲過程的返回值,索引從1開始
int totalRecord=cs.getInt(4);
int totalPage=cs.getInt(5);
ResultSet rs=(ResultSet)cs.getObject(6);
System.out.println("總記錄數為:"+totalRecord+",總頁數為:"+totalPage);
while(rs.next()){
System.out.println("雇員編號:"+rs.getInt("empno")+",雇員姓名:"+rs.getString("ename"));
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
ct.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!