oracle PL/SQL中的過載

dbhelper發表於2014-11-26
在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 ---
當然了總結的比較匆忙,還是有一些理解不深入和準備不充分的地方。諒解諒解。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8494287/viewspace-1346991/,如需轉載,請註明出處,否則將追究法律責任。

相關文章