3.5.3 函数与过程的重载

函数与过程是一段具有特定功能的程序段,在PL/SQL块中根据它们的名字进行调用。函数和过程的名字原则上可以由用户任意指定,只要满足命名规则即可,但是最好能够体现这段代码的功能。

在调用函数或过程时,根据它们的定义可能需要提供实际参数。如果实际参数的类型或数目与形式参数不一致,子程序将出现错误信息,并停止执行。如果需要对不同类型或不同数目的参数进行相似的处理,我们可以定义多个名字相同的函数,这就是子程序的重载。

重载子程序的名字相同,但是参数的类型或数目不同,返回值也可能不同。如果完全相同,就不是重载了,而是重复定义,这是不允许的。

在调用重载子程序时,主程序将根据实际参数的类型和数目,自动确定调用哪个子程序。例如,要对整数和浮点数分别求整数次幂,可以编写两个重载子程序,参数的类型分别是整数和浮点数。这样在调用时,如果提供的实际参数是浮点数,则自动调用对浮点数求幂的子程序。如果提供的实际参数是整数,则自动调用对整数求幂的子程序。例如,在下面的代码中,定义了两个重载函数,分别对整数8和浮点数8.8求10次幂。


DECLARE

m integer;

int_number integer;

int_result integer;

float_number float;

float_result float;

function power(x integer, n integer)RETURN integer—对整数x求n次幂

is

result integer:=1;

BEGIN

for i in 1..n loop

result:=result*x;

END loop;

RETURN result;

END;

function power(x float, n integer)RETURN float—对浮点数x求n次幂

is

result float:=1;

BEGIN

for i in 1..n loop

result:=result*x;

END loop;

RETURN result;

END;

BEGIN

m:=10;

int_number:=8;

int_result:=power(int_number, m);

dbms_output.put_line('对整数求幂的结果为:'||int_result);—调用第一个power函数

float_number:=8.8;

float_result:=power(float_number, m);—调用第二个power函数

dbms_output.put_line('对浮点数求幂的结果为:'||float_result);

END;


上述PL/SQL块的执行结果为:


SQL>/

对整数求幂的结果为:1073741824


对浮点数求幂的结果为:2785009760.0940212224上面的PL/SQL块提供了两个重载函数,在调用时根据参数的类型不同自动确定调用哪个函数。下面再看一个例子,根据参数的数目不同自动确定调用哪个函数。


DECLARE

procedure increase_salary(d_no emp.deptno%type, amount float)

is

BEGIN

UPDATE emp set sal=sal+amount WHERE deptno=d_no;

END;

procedure increase_salary(amount float)

is

BEGIN

UPDATE emp set sal=sal+amount;

END;

BEGIN

increase_salary(10,100.50);—调用第一个increase_salary过程

increase_salary(200);—调用第二个increase_salary过程

END;


在这个例子中定义了两个重载过程,用于为员工增加工资。第一个过程有两个参数,分别是部门号和增加的额度。第二个过程只有一个参数,即增加的额度。在调用过程时,如果提供了部门号和增加额度两个实际参数,则调用第一个increase_salary过程,为指定部门的员工增加工资。如果只提供了增加额度这一个参数,则调用第二个increase_salary过程,为所有员工增加工资。