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;
例题
用自定义函数解决问题,显示所有部门的平均工资和总工资和人数。
- 创建平均工资函数
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;
- 创建总工资函数
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;
- 创建人数函数
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;
- 调用
SELECT deptno,f_avg(deptno),f_sum(deptno),f_count(deptno) FROM emp GROUP BY deptno;