*Oracle存储函数*
*存储函数:*实际上是一段封装在oracle服务器中的一段plsql代码片段,他是已经编译好了的代码片段。
*语法:*
Create [or replace] function 函数名称(参数名称 in|out 参数类型,参数名称 in|out 参数类型,...)
Return 结果变量数据类型
Is
变量声明部分;
Begin
逻辑部分;
Return 结果变量;
[exception 异常处理部分]
End;
注意:end后面的;不能取消掉。参数列表里面默认是输入类型 in
*存储过程和存储函数的区别:*
1. 他们本质上没有区别
2. 存储函数存在的意义是给存储过程调用的 当然存储过程里面也能够调用存储函数,存储函数也能够调用存储函数,存储过程里面也能够调用存储过程。
3. 函数可以在SQL语句里面直接调用,而存储过程不可以
4. 存储过程能实现的,存储函数也能够实现,存储函数能实现的,存储过程也能实现
*案例:查询指定员工的年薪*
create or replace function func_getsal(vempno in number) return number
is
**--声明变量,保存年薪**
vtotalsal number;
begin
SELECT a.sal*12+nvl(comm,0) into vtotalsal FROM emp a WHERE a.empno=vempno;
return vtotalsal;
end;
编译
执行存储函数:
**-- Created on 2020/12/16 by ZHAOYONGQIANG**
declare
v_sal number;
begin
**-- Test statements here**
v_sal:= func_getsal(7788);
dbms_output.put_line(v_sal);
end;
执行结果:
36000
案例:
--查询指定员工的姓名和年薪
select a.ename,func_getsal(7788) from emp a WHERE a.empno='7788';
*Java调用oracle存储函数:*
package com.zyq.oracle;
import oracle.jdbc.OracleTypes;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* 调用oracle存储函数
*/
public class JdbcTest_Function {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.获取数据库连接对象
String url="jdbc:oracle:thin:@localhost:1521:orcl";
String user="scott";
String password="tiger";
Connection connection = DriverManager.getConnection(url, user, password);
//3.获得语句对象
String sql="{?=call func_getsal(?)}";
CallableStatement call = connection.prepareCall(sql);
//4.设置输出参数
call.registerOutParameter(1,OracleTypes.NUMBER);
//5.设置输入参数
call.setInt(2,7839);
//6.执行存储函数
call.execute();
//7.获取输出参数
double sal = call.getDouble(1);
System.out.println(sal);
//8.释放资源
call.close();
connection.close();
}
}
执行结果:60000.0