zoukankan      html  css  js  c++  java
  • Oracle自定义函数

      自定义函数和存储过程类似,区别是,存储过程注重于处理某件事情,多和DML有关,而函数注重于获取某些数据,多和DQL有关

    格式

    CREATE OR REPLACE FUNCTION 函数名(参数 数据类型) 
    RETURN 返回的数据类型 IS
    变量名  返回的数据类型;-- 存储返回的数据
    BEGIN
     -- 略 ,此处给变量赋值
      RETURN  变量名;-- 上面定义的变量
    end f_num;
    

    调用函数就像调用普通数据库函数一样,一个SQL语句执行即可:

    SELECT f_num(10) FROM dual;
    

    函数的出参

    -- v_sal_avg是函数的出参,另外函数还有一个返回值
    CREATE OR REPLACE FUNCTION f_num(
    v_deptno INTEGER,-- 部门编号
    v_sal_avg OUT INTEGER-- 部门平均工资
    ) 
    RETURN INTEGER IS
    v_num INTEGER;
    BEGIN
      SELECT AVG(sal) INTO v_sal_avg FROM emp 
       WHERE deptno = v_deptno;
      SELECT COUNT(*) INTO v_num FROM emp WHERE deptno=v_deptno;
      RETURN v_num;
    end f_num;
    

    调用函数时因为有出参,所以要用程序来处理(因为要定义变量)

    declare 
      -- 如果要用程序调用函数就要有变量存储结果数据
      v_num integer;
      v_sal_avg INTEGER;
    begin
      v_num:=f_num(10,v_sal_avg);
      dbms_output.put_line('10部门有'||v_num||'人,平均工资是'||v_sal_avg);
    end;
    

    例题

    用自定义函数解决问题,显示所有部门的平均工资和总工资和人数。

    1. 创建平均工资函数
    CREATE OR REPLACE FUNCTION f_avg(v_dno emp.deptno%TYPE)
    RETURN NUMBER IS
    v_avg NUMBER(6,2);
    BEGIN 
      SELECT AVG(sal) INTO v_avg FROM emp WHERE deptno=v_dno;
      RETURN v_avg;
    END;
    
    1. 创建总工资函数
    CREATE OR REPLACE FUNCTION f_sum(v_dno emp.deptno%TYPE)
    RETURN NUMBER IS
    v_sum NUMBER;
    BEGIN 
      SELECT SUM(sal) INTO v_sum FROM emp WHERE deptno=v_dno;
      RETURN v_sum;
    END;
    
    1. 创建人数函数
    CREATE OR REPLACE FUNCTION f_count(v_dno emp.deptno%TYPE)
    RETURN NUMBER IS
    v_count NUMBER;
    BEGIN 
      SELECT COUNT(*) INTO v_count FROM emp WHERE deptno=v_dno;
      RETURN v_count;
    END;
    
    1. 调用
    SELECT deptno,f_avg(deptno),f_sum(deptno),f_count(deptno) FROM emp GROUP BY deptno;
    
  • 相关阅读:
    Python 多核 多线程 调度
    mysql-select for update
    Python logging模块
    TCP/IP和HTTP协议与Socket的区别联系
    DNS+CDN
    wget命令
    Cannot find module 'webpack-cli/bin/config-yargs
    TS7015: Element implicitly has an 'any' type because index expression is not of type 'number'
    js 创建私有变量
    报错集锦及解决方案
  • 原文地址:https://www.cnblogs.com/zbh355376/p/14336385.html
Copyright © 2011-2022 走看看