JDBC調用存儲過程和函數

在數據庫中咱們能夠寫一些存儲過程和函數,來封裝一些經常使用的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();
        }

    }
相關文章
相關標籤/搜索