oracle存储函数

*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

原文地址:https://www.cnblogs.com/dongyaotou/p/14259196.html