zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    (原创)c#学习笔记10--定义类成员01--成员定义06--自动属性
    (原创)c#学习笔记10--定义类成员01--成员定义03--定义属性
    (原创)c#学习笔记10--定义类成员01--成员定义02--建立方法
    【BZOJ3110】K大数查询(ZJOI2013)-整体二分+线段树
    【BZOJ3110】K大数查询(ZJOI2013)-整体二分+线段树
    【HDU5412】CRB and Queries-整体二分:带修改区间第K小
    【HDU5412】CRB and Queries-整体二分:带修改区间第K小
    【NOI2007T2】货币兑换-DP斜率优化+CDQ分治
    【NOI2007T2】货币兑换-DP斜率优化+CDQ分治
    【BZOJ3295】动态逆序对(CQOI2011)-CDQ分治:三维偏序
  • 原文地址:https://www.cnblogs.com/dongyaotou/p/14259196.html
Copyright © 2011-2022 走看看