自定义函数

语法:
create or replace function 函数名字(
    参数1   数据类型(不能有长度),
    参数2   数据类型(不能有长度),
    参数3   数据类型(不能有长度)
)return 数据类型(没有长度)
is
    参数4 数据类型(可以有长度);
    参数5 数据类型(可以有长度);
begin
    函数要执行的内容;
    return 返回值;
end;

例子1:给定一个员工编号,查询员工的工资
create or replace function findSalFun(
    eno   emp.empno%type
)return emp.sal%type 
is
    v_sal emp.sal%type;
begin
    select sal into v_sal from emp where empno=eno;
    return v_sal;
end;
测试:
declare
    v_sal emp.sal%type;
begin
    v_sal:=findSalFun(7369);
    --xxx:=length('abc');
    --yyy:=to_char(,);
    dbms_output.put_line(v_sal);
end;

set serveroutput on;

call findSalFun(7369);

函数还可以放在sql语句中调用
select empno,findSalFun(empno) from emp;

例子2:给定一个名字,根据名字,计算员工的税金
create or replace function computeFaxFun(
    v_name emp.ename%type
)return emp.sal%type
is
    v_sal emp.sal%type;
    mid_sal emp.sal%type;
    fax   emp.sal%type;
begin
    select sal into v_sal from emp where ename=v_name;
    mid_sal:=v_sal - 3500;
    if mid_sal<=0 or mid_sal is null then fax:=0;
        elsif mid_sal<=1500 then fax:=mid_sal*0.03-0;
        else fax:=mid_sal*0.45-13505;
    end if;
    return fax;
end;

测试
select empno,ename,sal,computeFaxFun(ename) fax from emp;

例子3:给员工编号,函数返回一行数据;
create or replace function findEmpInfoFun(
    eno emp.empno%type
)return emp%rowtype
is
    v_emp emp%rowtype;
begin
    select * into v_emp from emp where empno=eno;
    return v_emp;
end;

测试
sql语句中无法解析rowtype行对象,所以sql无法调用该函数
select findEmpInfoFun(empno) from emp;--报错

declare
    eno emp.empno%type:=7369;
    empinfo emp%rowtype;
begin
    empinfo:=findEmpInfoFun(eno);
    dbms_output.put_line(empinfo.empno||','||empinfo.ename||','||empinfo.sal);
end;

例子4:函数返回多行数据呢?

函数中,没有参数传入的时候,不能写小括号
create or replace function findallEmpFun return sys_refcursor
is
    allemp sys_refcursor;
begin
    open allemp for select * from emp;
    return allemp;
end;

测试
declare
    allemp sys_refcursor;
    empinfo emp%rowtype;
begin
    allemp:=findallEmpFun;
    loop
        fetch allemp into empinfo;
        if allemp%notfound then exit;end if;
        dbms_output.put_line(empinfo.empno||','||empinfo.ename||','||empinfo.sal);
    end loop;
    if allemp%isopen then close allemp; end if;
end;

过程与函数的区别:

1.关键字不一样,过程使用procedure,函数使用function

2.在过程中,所有的参数都放在小括号里面,通过in来表示传入的参数,通过out来表示返回的数据; 在函数中,小括号中放的都是传入的参数,也没有in/out的写法,返回的数据都通过return 来完成

3.在过程中,对于需要返回的结果,只需要存放到out修饰的参数里面就可以了 在函数中,过程语句执行完之后,必须通过return 返回执行结果

4.调用过程时,如果有返回数据,需要把变量放到过程的小括号中来接收结果; 调用函数的时候,则通过给变量赋值的方式来接收函数执行的结果

5.过程一般供程序调用,而函数一般由其他过程或者函数来调用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好好羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值