在數據庫中咱們能夠寫一些存儲過程和函數,來封裝一些經常使用的SQL語句,存儲過程和函數目的是爲了可重複地執行操做數據庫的sql語句的集合java
返回值上: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中建立的,其餘的數據庫大同小異spa
在Dao中調用:code
// 無返回值的存儲過程 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(); } }
建立有返回值的存儲過程:blog
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表示get
在Dao中調用:io
// 帶返回值的存儲過程 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方法獲得返回結果function
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(); } }