嵌套函数定义

PLOSCAR支持在函数、存储过程、触发器、包内函数、包内存储过程中嵌套函数定义、存储过程定义。

最大支持 100 层嵌套。

示例

示例1: 函数中嵌套函数定义

--  清理环境
DROP FUNCTION func1();

--  创建函数
CREATE OR REPLACE FUNCTION func1 RETURN VARCHAR
AS
    --  嵌套函数定义
    FUNCTION func2(j VARCHAR) RETURN VARCHAR
    AS
    BEGIN
        RETURN j + ' FROM FUNC2 !';
    END;
BEGIN
    --  调用嵌套函数

    RETURN func2('MESSAGE');
END;
/

--  调用函数
SELECT func1 FROM DUAL; 
FUNC1(varchar)      |
--------------------
MESSAGE FROM FUNC2 !|
总数目:1

--  清理环境
DROP FUNCTION func1();

示例2: 存储过程中嵌套函数定义

--  清理环境
DROP PROCEDURE proc1;

--  创建存储过程
CREATE OR REPLACE PROCEDURE proc1
AS
    --  嵌套函数定义
    FUNCTION func2(j VARCHAR) RETURN VARCHAR
    AS
    BEGIN
        RETURN j + ' FROM FUNC2 !';
    END;
BEGIN
    --  调用嵌套函数

    DBMS_OUTPUT.PUT_LINE(func2('MESSAGE'));
END;
/
  
--  执行存储过程
EXEC proc1();

--  清理环境
DROP PROCEDURE proc1;

示例3: 触发器中嵌套函数定义

--  清理环境
DROP TRIGGER trg1;
DROP TABLE tab1 CASCADE;

--  创建表
CREATE TABLE tab1(a INT);

--  创建触发器
CREATE TRIGGER trg1 BEFORE INSERT ON tab1 FOR EACH ROW
DECLARE
    --  嵌套函数定义
    FUNCTION func2(j VARCHAR) RETURN VARCHAR
    AS
    BEGIN
        RETURN j + ' FROM FUNC2 !';
    END;
BEGIN
    --  调用嵌套函数
    DBMS_OUTPUT.PUT_LINE(func2('MESSAGE'));
END;
/
  
--  触发触发器
INSERT INTO tab1 VALUES(100);
1
MESSAGE FROM FUNC2 !

--  清理环境
DROP TRIGGER trg1;
DROP TABLE tab1 CASCADE;

示例4: 包内函数中嵌套函数定义

--  清理环境
DROP PACKAGE pack1;

--  创建包
CREATE OR REPLACE PACKAGE pack1
AS
    FUNCTION func1 RETURN VARCHAR;
END;
/

--  创建包体
CREATE OR REPLACE PACKAGE BODY pack1
AS
    --  包内函数定义
    FUNCTION func1 RETURN VARCHAR
    AS
        --  嵌套函数定义
        FUNCTION func2(j VARCHAR) RETURN VARCHAR
        AS
        BEGIN
            RETURN j + ' FROM FUNC2 !';
        END;
    BEGIN
        --  调用嵌套函数

        RETURN func2('MESSAGE');
    END;
END;
/
  
--  调用包内函数
SELECT pack1.func1() FROM DUAL;
FUNC1(varchar)      |
--------------------
MESSAGE FROM FUNC2 !|
总数目:1

--  清理环境
DROP PACKAGE pack1;

示例5: 包内存储过程中嵌套函数定义

--  清理环境
DROP PACKAGE pack1;

--  创建包
CREATE OR REPLACE PACKAGE pack1
AS
    PROCEDURE proc1;
END;
/

--  创建包体
CREATE OR REPLACE PACKAGE BODY pack1
AS
    --  包内存储过程定义
    PROCEDURE proc1
    AS
        --  嵌套函数定义
        FUNCTION func2(j VARCHAR) RETURN VARCHAR
        AS
        BEGIN
            RETURN j + ' FROM FUNC2 !';
        END;
    BEGIN
        --  调用嵌套函数

        DBMS_OUTPUT.PUT_LINE(func2('MESSAGE'));
    END;
END;
/
  
--  执行包内存储过程
EXEC pack1.proc1();

--  清理环境
DROP PACKAGE pack1;