oracle PL/SQL中的重载

简介: 在java中,有方法重写,方法重载,重载的一个典型例子就是类中的构造函数,可以根据自己的需求定义多个构造函数,默认是一个无参数的空函数。 重写是基于父类子类之间的多态性体现上,父类的一个方法,在子类中可以重写. oracle中也可以有重载的实现。
在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 ---
当然了总结的比较匆忙,还是有一些理解不深入和准备不充分的地方。谅解谅解。

目录
相关文章
|
5月前
|
SQL Oracle 关系型数据库
解决大小写、保留字与特殊字符问题!Oracle双引号在SQL中的特殊应用
在Oracle数据库开发中,双引号的使用是一个重要但易被忽视的细节。本文全面解析了双引号在SQL中的特殊应用场景,包括解决标识符与保留字冲突、强制保留大小写、支持特殊字符和数字开头标识符等。同时提供了最佳实践建议,帮助开发者规避常见错误,提高代码可维护性和效率。
207 6
|
6月前
|
SQL Oracle 关系型数据库
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
|
6月前
|
SQL Oracle 关系型数据库
【YashanDB知识库】yashandb执行包含带oracle dblink表的sql时性能差
【YashanDB知识库】yashandb执行包含带oracle dblink表的sql时性能差
|
6月前
|
SQL Oracle 关系型数据库
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
本文来自YashanDB官网,介绍如何处理Oracle客户端sql*plus中使用@@调用同级目录SQL脚本的场景。崖山数据库23.2.x.100已支持@@用法,但旧版本可通过Python脚本批量重写SQL文件,将@@替换为绝对路径。文章通过Oracle示例展示了具体用法,并提供Python脚本实现自动化处理,最后调整批处理脚本以适配YashanDB运行环境。
|
8月前
|
SQL Oracle 关系型数据库
如何在 Oracle 中配置和使用 SQL Profiles 来优化查询性能?
在 Oracle 数据库中,SQL Profiles 是优化查询性能的工具,通过提供额外统计信息帮助生成更有效的执行计划。配置和使用步骤包括:1. 启用自动 SQL 调优;2. 手动创建 SQL Profile,涉及收集、执行调优任务、查看报告及应用建议;3. 验证效果;4. 使用 `DBA_SQL_PROFILES` 视图管理 Profile。
|
SQL 关系型数据库 Oracle
ORACLE SQL优化之ORA-03150&ORA-02055&ORA-02063
                                                                                                             >   
4985 0
|
SQL Oracle 关系型数据库
Oracle SQL优化之多表连接
Oracle SQL优化之多表连接
720 0
Oracle SQL优化之多表连接
|
SQL 存储 Oracle
Oracle数据库 | SQL语句执行计划、语句跟踪与优化实例
Oracle数据库 | SQL语句执行计划、语句跟踪与优化实例
441 0
|
SQL 存储 Oracle
Oracle SQL语句优化方法总结
  1、SQL语句尽量用大写的   因为oracle总是先解析SQL语句,把小写的字母转换成大写的再执行。   2、使用表的别名   当在SQL语句中连接多个表时, 尽量使用表的别名并把别名前缀于每个列上。这样一来,   就可以减少解析的时间并减少那些由列歧义引起的语法错误。   3、选择最有效率的表名顺序(只在基于规则的优化器(RBO)中有效)
257 0

推荐镜像

更多