9.12. PL/SQL函数 - PL/SQL教程

编辑时间: 2016-04-22 23:48:16    关键字:

PL/SQL函数与过程相同,不同之处在于函数有一个返回值。因此,前面的章节中的所有讨论都适用于函数。

创建函数

建立一个独立函数可以使用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表中的客户总数。我们将使用CUSTOMERS表,已在前面PL/SQL变量的章节中创建:

Select * from customers;  +----+----------+-----+-----------+----------+ | ID | NAME     | AGE | ADDRESS   | SALARY   | +----+----------+-----+-----------+----------+ |  1 | Ramesh   |  32 | Ahmedabad |  2000.00 | |  2 | Khilan   |  25 | Delhi     |  1500.00 | |  3 | kaushik  |  23 | Kota      |  2000.00 | |  4 | Chaitali |  25 | Mumbai    |  6500.00 | |  5 | Hardik   |  27 | Bhopal    |  8500.00 | |  6 | Komal    |  22 | MP        |  4500.00 | +----+----------+-----+-----------+----------+ 
CREATE OR REPLACE FUNCTION totalCustomers RETURN number IS    total number(2) := 0; BEGIN    SELECT count(*) into total    FROM customers;     RETURN total; END; / 

当上面的代码中使用SQL提示执行,它会产生以下结果:

Function created. 

调用一个函数

当创建一个函数,给定什么样的函数之前必须做一个定义。要使用函数必须调用该函数来执行规定的任务。当程序调用的函数,程序控制被转移到所调用的函数。

调用函数定义执行任务时,被执行的return语句或达到其最后一个语句,程序控制返回到主程序。

调用函数只需要通过必要的参数以及函数名称,如果函数返回一个值,那么可以存储返回值。下面的程序是调用一个匿名块函数 totalCustomers:

DECLARE    c number(2); BEGIN    c := totalCustomers();    dbms_output.put_line('Total no. of Customers: ' || c); END; / 

当上述代码在SQL提示符执行时,它产生了以下结果:

Total no. of Customers: 6  PL/SQL procedure successfully completed. 

例子:

下面就是一个例子这表明声明,定义和调用一简单的PL/SQL函数,计算并返回两个值中的最大值。

DECLARE    a number;    b number;    c number; FUNCTION findMax(x IN number, y IN number)  RETURN number IS     z number; BEGIN    IF x > y THEN       z:= x;    ELSE       Z:= y;    END IF;     RETURN z; END;  BEGIN    a:= 23;    b:= 45;     c := findMax(a, b);    dbms_output.put_line(' Maximum of (23,45): ' || c); END; / 

当上述代码在SQL提示符执行时,它产生了以下结果:

Maximum of (23,45): 45   PL/SQL procedure successfully completed. 

PL/SQL递归函数

我们已经看到,程序或子程序可以调用另一个子程序。当子程序调用自身,它被称为递归调用。

为了说明这个概念,让我们计算一个数的阶乘。一个数n的阶乘定义为:

n! = n*(n-1)!    = n*(n-1)*(n-2)!       ...    = n*(n-1)*(n-2)*(n-3)... 1 

下面的程序计算给定数的阶乘通过调用自身递归:

DECLARE    num number;    factorial number;  FUNCTION fact(x number) RETURN number  IS    f number; BEGIN    IF x=0 THEN       f := 1;    ELSE       f := x * fact(x-1);    END IF; RETURN f; END;  BEGIN    num:= 6;    factorial := fact(num);    dbms_output.put_line(' Factorial '|| num || ' is ' || factorial); END; / 

当上述代码在SQL提示符执行时,它产生了以下结果:

Factorial 6 is 720   PL/SQL procedure successfully completed. 

推荐热图

合作推荐

2010-2018 可思数据版权所有 About SYKV | ICP备案:京ICP备14056871号