JDBC調用存儲過程和函數


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

    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM