在數據庫中我們可以寫一些存儲過程和函數,來封裝一些常用的SQL語句,存儲過程和函數目的是為了可重復地執行操作數據庫的sql語句的集合
返回值上:
- 存儲過程的返回值,可以有多個值
- 函數的返回值,只有一個值
函數是可以嵌入在SQL中使用的,可以在SELECT等SQL語句中調用,而存儲過程則不行。我們可以在數據庫中創建一些常用的存儲過程和函數,這樣我們在數據訪問層直接調用即可。這里記錄一下使用JDBC調用存儲過程和函數的方法
調用沒有返回值的存儲過程
首先我們在數據庫中創建一個沒有返回值的存儲過程:
create or replace procedure proc_Ins_Dept(vid in varchar2 ,vname in varchar2,vloc in varchar2) is begin insert into Dept values(vid,vname,vloc); end proc_Ins_Dept;
我是在Oracle中創建的,其他的數據庫大同小異
在Dao中調用:
// 無返回值的存儲過程 public void proc1() { try { Connection conn = super.getConn(); //調用了BaseDao創建連接 CallableStatement cs = conn.prepareCall("{call proc_Ins_Dept(?,?,?)}"); //調用格式 {call 存儲過程名(參數)} cs.setObject(1, 76); cs.setObject(2, "技術部"); cs.setObject(3, "zhengzhou"); cs.execute(); //執行 cs.close(); conn.close(); } catch (Exception ex) { ex.printStackTrace(); } }
調用有返回值的存儲過程
創建有返回值的存儲過程:
create or replace procedure pro_Ins_Dept (vid in varchar2,vname in varchar2,vloc in varchar2,vresult out varchar2) is begin insert into Dept values(vid,vname,vloc); vresult:='success'; Exception when others then vresult:='fail'; end pro_Ins_Dept;
輸入值使用in,返回值使用out表示
在Dao中調用:
// 帶返回值的存儲過程 public void proc2() { try { Connection conn = super.getConn(); CallableStatement cs = conn.prepareCall("{call proc_Ins_Dept2(?,?,?,?)}"); cs.setObject(1, 76); cs.setObject(2, "市場部"); cs.setObject(3, "luoyang"); cs.registerOutParameter(4, java.sql.Types.VARCHAR); //注冊返回類型(sql類型) cs.execute(); Object objRtn = cs.getObject(4); //得到返回值 System.out.println(objRtn); cs.close(); conn.close(); } catch (Exception ex) { ex.printStackTrace(); } }
唯一不同的是我們需要給返回值注冊類型,可以在java.sql.Types類中找到對應的Sql類型,Oracle中的varchar2對應的也是varchar。最后使用CallableStatement的get方法得到返回結果
調用自定義函數
SQL語句:
create or replace function fun_avg_dept(vdeptno in number) return number is r number; begin select avg(sal) into r from emp where deptno=vdeptno; return(r); end fun_avg_dept;
Dao中調用:
// 帶返回值的自定義函數 public void fun1() { try { Connection conn = super.getConn(); //函數可以嵌入到Sql中 String sql = "select fun_avg_dept(?) from dual"; //調用方式還是和使用ps調用普通SQL一樣 PreparedStatement ps = conn.prepareStatement(sql); ps.setObject(1, 10); ResultSet rs = ps.executeQuery(); if (rs.next()) { System.out.println(rs.getObject(1)); } rs.close(); ps.close(); conn.close(); } catch (Exception ex) { ex.printStackTrace(); } }