嵌套函数定义¶
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;