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();
        }

    }
相关文章
相关标签/搜索