存储过程
在java中经常用封装的思想来提高代码的重用性,在java中为什么要定义方法?原因是有一个功能是需要在不同的地方多次使用的,如果在每一个需要调用的地方都写一遍会造成代码量很大,所以我们把他抽取成单独的方法,在需要使用的时候调用这个方法。同样的道理,如果同一个数据库操作需要被多次使用,这个时候可以考虑将他抽取出来,这样被抽取出来的这个类似与方法的东西就是存储过程。所以,简单的说,存储过程实际就是封装在服务器上的一段PL/SQL代码片段,已经编译好了的代码片段。可见,由于已经编译好了,所以,客户端调用存储过程的执行效率比直接执行sql语句的效率会快。
语法结构:
create [or replace] procedure 存储过程的名称(参数名 in|out 参数类型)
is | as
--声明部分
begin
--业务逻辑
end;
实例:给指定员工涨工资,并且打印涨薪前和涨薪后的工资。
create or replace procedure pro_test1(vempno in number,vnum in number)
is
--声明变量
vsal number;
begin
--业务逻辑
--查询当前的工资
select sal into vsal from emp where empno=vempno;
dbms_output.put_line('涨薪前'||vsal);
--更新工资
update emp set sal=vsal+vnum where empno=vempno;
dbms_output.put_line('涨薪后'||(vsal+vnum));
--提交,更新操作,提交的是事务
commit;
end;
调用上面的存储过程:
call pro_test1(给定一个员工编号,涨工资钱数);
存储函数
存储函数的其实和存储过程差不多。
语法:
create[or replace] function 存储函数的名字(参数名 in|out 参数类型...) return 参数类型
is|as
begin
end;
实例:查询指定员工的年薪sal*12+nvl(comm,0)
create or replace function fun_test1(vempno number ) return number
is
--声明变量
vtotalsal number;
begin
select sal*12+nvl(comm,0) into vtotalsal from emp where empno=vempno;
return vtotalsal;
end;
调用存储函数:
declare
vsal number;
begin
vsal :=fun_test1(7369);
dbms_output.put_line(vsal);
end;
JDBC调用存储过程:
//1、导入驱动包
//2、注册驱动
Class.forName("oracle.jdbc.OracleDriver");
//3、获取连接
Connection conn = DriverManager.getConnection
("jdbc:oracle:thin:@localhost:1521:ORCL", "wsh", "wsh");
//4、获取执行sql的statement对象,封装参数,执行sql
String sql="{call proc_gettotalsal(?,?)}";
CallableStatement statement = conn.prepareCall(sql);
//设置输入参数
statement.setInt(1, 7788);
//注册输出参数
statement.registerOutParameter(2, OracleTypes.NUMBER);
//执行statement对象
statement.execute();
//5、获取结果,输出参数是几,获取的就是几
int totalsal = statement.getInt(2);
//输出结果:工资前和工资后
System.out.println("工资"+totalsal);
//6、释放资源
statement.close();
conn.close();
JDBC调用存储函数:
//1、导入驱动包
//2、注册驱动
Class.forName("oracle.jdbc.OracleDriver");
//3、获取连接
Connection conn = DriverManager.getConnection
("jdbc:oracle:thin:@localhost:1521:ORCL",
"wsh", "wsh");
//4、获取执行sql的statement对象,封装参数,执行sql
String sql="{?= call func_getsal(?)}";
CallableStatement statement = conn.prepareCall(sql);
//5、获取结果
//设置输出参数
statement.registerOutParameter(1, OracleTypes.NUMBER);
//设置输入参数
statement.setInt(2, 7788);
//执行sql
statement.execute();
int totalsal = statement.getInt(1);
System.out.println("年薪工资:"+totalsal);
//6、关闭资源
statement.close();
conn.close();