本文介绍如何创建子函数。

函数声明中指定的 FUNCTION 子句用于指定和命名该块本地的子函数。

术语指SPL块结构,该结构由可选的声明部分、必需的可执行部分和可选的异常部分组成。块是独立存储过程和函数、匿名块、子程序、触发器、包和对象类型方法的结构。

短语标识符是块本地的意味着标识符(即,变量、游标、类型或子程序)在该块的声明部分中声明,因此可由 SPL 代码在该块的可执行部分和可选异常部分中进行访问。

子函数只能在声明部分中包括所有其他变量、游标和类型后声明。(也就是说,子程序必须是最后一组声明。)

PROCEDURE name [ (parameters) ]{ IS | AS }
    [ PRAGMA AUTONOMOUS_TRANSACTION; ]
    [ declarations ]
  BEGIN
    statements
  END [ name ];
表 1. 参数
参数 说明
name name 是子函数的标识符。
parameters parameters 是形参的列表。
data_type data_type 是函数的 RETURN 语句所返回值的数据类型。
PRAGMA AUTONOMOUS_TRANSACTION PRAGMA AUTONOMOUS_TRANSACTION 是将子函数设置为自治事务的指令。
declarations declarations 是变量、游标、类型或子程序声明。如果包括子程序声明,则它们必须在所有其他变量、游标和类型声明之后。
statements statements 是 SPL 程序语句(BEGIN - END 块可以包含 EXCEPTION 部分)。

示例

以下示例显示如何使用递归子函数:

DECLARE
    FUNCTION factorial (
        n           BINARY_INTEGER
    ) RETURN BINARY_INTEGER
    IS
    BEGIN
        IF n = 1 THEN
            RETURN n;
        ELSE
            RETURN n * factorial(n-1);
        END IF;
    END factorial;
BEGIN
    FOR i IN 1..5 LOOP
        DBMS_OUTPUT.PUT_LINE(i || '! = ' || factorial(i));
    END LOOP;
END;

该示例的输出如下:

1! = 1
2! = 2
3! = 6
4! = 24
5! = 120