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 ---
当然了总结的比较匆忙,还是有一些理解不深入和准备不充分的地方。谅解谅解。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Spring Boot+Gradle+ MyBatisPlus3.x搭建企业级的后台分离框架
- 不要再对类别变量进行独热编码了
- 面试Java基础问题汇总
- K8s集群上使用Helm部署2.4.6版本Rancher集群
- 一个工作三年的同事,居然还搞不清深拷贝、浅拷贝...
- 太有意思了,教你实现实现王者荣耀团战!
- 动画:什么是基数排序?
- 一个有意思的分钱模拟问题
- 如何快速的开发一个完整的直播购物源码,基础篇
- 「拥抱开源」Nacos 实战篇
- 仅2M!免费软件又一次干掉了付费版
- python爬虫学习 爬取幽默笑话网站
- 如何用Python快速优雅的批量修改Word文档样式?
- 为什么MySQL不推荐使用uuid或者雪花id作为主键?
- 用Python打造一款文件搜索工具,所有功能自己定义!