函数与过程(也叫程序)相同,只不过函数有返回一个值,而过程没有返回值。
1. 创建函数
使用CREATE FUNCTION
语句创建独立函数。CREATE OR REPLACE PROCEDURE
语句的简化语法如下:
CREATE [OR REPLACE] FUNCTION function_name
[(parameter_name [IN | OUT | IN OUT] type [, ...])]
RETURN return_datatype
{IS | AS}
BEGIN
< function_body >
END [function_name];
其中,
- function-name是指定要创建的函数的名称。
- [OR REPLACE]选项指示是否允许修改现有的函数。
- 可选参数列表包含参数的名称,模式和类型。
IN
表示将从外部传递的值,OUT
表示将用于返回过程外的值的参数。 - 函数必须包含一个返回(
RETURN
)语句。 - RETURN子句指定要从函数返回的数据类型。
- function-body包含可执行部分。
- 使用
AS
关键字代替IS
关键字,用来创建独立的函数。
示例
以下示例说明如何创建和调用独立函数。此函数返回客户表(CUSTOMERS
)中的总数。
基于上面表和数据记录,创建一个函数:totalCustomers 来计算总客户数量。参考以下代码 -
SQL> create or replace function totalCustomers
2 return number is
3 total number(2) := 0;
4 begin
5 select count(*) into total
6 from customers;
7
8 return total;
9 end;
10 /
Function created
2. 调用函数
在创建一个函数时,我们给出一个定义函数的语句以及实现的功能。 要使用一个函数,必须调用该函数来执行定义的任务。当程序调用一个函数时,程序控制被传递给被调用的函数。
被调用的函数执行定义的任务,当执行返回语句或达到最后一个结束语句时,它将程序控制返回到主程序。
如果调用一个函数,只需要传递所需的参数和函数名,如果函数返回一个值,那么可以存储返回的值。 以下程序演示如何从匿名块调用函数totalCustomers -
SQL> declare
2 c number(2);
3 begin
4 c := totalCustomers();
5 dbms_output.put_line('当前客户总数为: ' || c);
6 end;
7 /
当前客户总数为: 6
PL/SQL procedure successfully completed
示例
以下示例演示声明,定义和调用一个简单的PL/SQL函数,该函数计算并返回两个值中的最大值。
SQL> create or replace function findMax(x in number , y in number)
2 return number
3 is
4 z number ;
5 begin
6 if x > y then
7 z := x ;
8 else
9 z := y ;
10 end if ;
11 return z;
12 end;
13 /
Function created
SQL> declare
2 a number;
3 b number;
4 c number;
5 begin
6 a := 23;
7 b := 45;
8 c := findMax(a,b);
9 dbms_output.put_line('两个数:23和45中最大值为:' || c);
10 end;
11 /
两个数:23和45中最大值为:45
PL/SQL procedure successfully completed
3. PL/SQL递归函数
我们在前面已经看到程序或子程序可能会调用另一个子程序。当子程序调用自身时,它被称为递归调用,该过程称为递归。
为了更好地说明递归这个概念,让我们来看看计算一个给定数字的阶乘示例。 数字n
的因子被定义为 -
n! = n*(n-1)!
= n*(n-1)*(n-2)!
...
= n*(n-1)*(n-2)*(n-3)... 1
以下过程是通过递归调用本身来计算给定数字的阶乘 -
SQL> declare
2 num number;
3 factorial number;
4
5 function fact(x number)
6 return number
7 is
8 f number;
9 begin
10 if x=0 then
11 f := 1 ;
12 else
13 f := x * fact(x-1);
14 end if;
15 return f;
16 end;
17
18 begin
19 num := 10;
20 factorial := fact(num);
21 dbms_output.put_line(' 数字 ' || num || ' 的阶乘是: ' || factorial);
22 end;
23 /
数字 10 的阶乘是: 3628800
PL/SQL procedure successfully completed