oracle PL/SQL中的重载 (r3笔记27天)

时间:2022-05-04
本文章向大家介绍oracle PL/SQL中的重载 (r3笔记27天),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

在java中,有方法重写,方法重载,重载的一个典型例子就是类中的构造函数,可以根据自己的需求定义多个构造函数,默认是一个无参数的空函数。 重写是基于父类子类之间的多态性体现上,父类的一个方法,在子类中可以重写. oracle中也可以有重载的实现。自己在总结的时候归纳了一下两种。 一种是通过包来实现,一种是通过pl/sql块来实现。相比两者的实现,包是静态的,而pl/sql块是动态的。 可以通过如下的例子来说明一下。 我们现在又一个需求,需要根据输入的参数得到对应的累计值,输入的参数从2个到4个不等,需要直接调函数来实现。调用的函数名也有一样。 比如类似下面的样子。输入2个参数还是4个参数都是同样的函数名,这样就加灵活。

select pack_bonus.get_bonus(1.2,1.4)from dual;

PACK_BONUS.GET_BONUS(1.2,1.4) ----------------------------- 3.36

select pack_bonus.get_bonus(1.3,1,5,1.4) from dual;

PACK_BONUS.GET_BONUS(1.3,1,5,1.4) --------------------------------- 46.04 实现的代码如下:

create or replace package pack_bonus as function get_bonus(param1 in number,param2 in number,param3 in number,param4 in number) return number; function get_bonus(param1 in number,param2 in number,param3 in number) return number; function get_bonus(param1 in number,param2 in number)return number; end; /

create package body pack_bonus as function get_bonus(param1 in number,param2 in number,param3 in number,param4 in number) return number is bonus number :=0; begin bonus:=2*(param1*param2+param1*param3+param1*param4+param2*param3+param2*param4+param3*param4); return bonus; end;

function get_bonus(param1 in number,param2 in number,param3 in number) return number is bonus number :=0; begin bonus:=2*(param1*param2+param1*param3+param2*param3); return bonus; end;

function get_bonus(param1 in number,param2 in number) return number is bonus number :=0; begin bonus:=2*(param1*param2); return bonus; end; end; / 而Pls/sql的实现,是运行时的,代码也是运行时编译的。 我们可以指定两个同名的函数,但是参数类型不同,同名的存储过程,在调用的时候根据参数和条件进行调用。

declare function get_message(param1 in varchar2,param2 in number) return varchar2 is message varchar2(200); begin message :='test '||param1||' '||param2; dbms_output.put_line('invoke from function 1, '||param1||' '||param2||' '||message); return message ; end;

function get_message(param1 in number,param2 in number) return number is message number :=0; begin message:=2*(param1*param2); dbms_output.put_line('invoke from function 2, '||param1||' '||param2||' '||message); return message; end;

procedure get_message(param1 in number,param2 in number) is message varchar2(100) ; begin message :=param1||' '||param2; dbms_output.put_line('invoke from proc '||param1||' '||param2||' '||message); end;

begin if(get_message('a',10)='test a 10') then dbms_output.put_line('-----invoke from function 1---'); end if; if(get_message(10,10)>0) then dbms_output.put_line('---invoke from function 2---'); end if; get_message(10,10); dbms_output.put_line('---invoke from proc ---');

end; / 调用后的结果,可以看到在输入参数是字符串和数字的时候会根据不同的条件来选择调用哪个函数,存储过程。 invoke from function 1, a 10 test a 10 -----invoke from function 1--- invoke from function 2, 10 10 200 ---invoke from function 2--- invoke from proc 10 10 10 10 ---invoke from proc --- 当然了总结的比较匆忙,还是有一些理解不深入和准备不充分的地方。谅解谅解。