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(); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?