- PL/SQL 教程
- PL/SQL - 首页
- PL/SQL - 概述
- PL/SQL - 环境
- PL/SQL - 基本语法
- PL/SQL - 数据类型
- PL/SQL - 变量
- PL/SQL - 常量和字面量
- PL/SQL - 运算符
- PL/SQL - 条件语句
- PL/SQL - 循环语句
- PL/SQL - 字符串
- PL/SQL - 数组
- PL/SQL - 过程
- PL/SQL - 函数
- PL/SQL - 游标
- PL/SQL - 记录
- PL/SQL - 异常处理
- PL/SQL - 触发器
- PL/SQL - 包
- PL/SQL - 集合
- PL/SQL - 事务
- PL/SQL - 日期和时间
- PL/SQL - DBMS 输出
- PL/SQL - 面向对象
- PL/SQL 有用资源
- PL/SQL - 问答
- PL/SQL - 快速指南
- PL/SQL - 有用资源
- PL/SQL - 讨论
PL/SQL - 函数
本章将讨论 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 的总数。
我们将使用 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 语句或到达 **最后一个 end 语句** 时,它将程序控制权返回给主程序。
要调用函数,您只需将所需的参数与函数名称一起传递,如果函数返回值,则可以存储返回值。以下程序从匿名块中调用函数 **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.