#嵌套子程序
在PL语句块声明部分可以定义子程序。
嵌套子程序可以是过程体或函数,可以在匿名块、存储过程、自定义函数、自定义高级包等PL对象的声明部分进行定义。
嵌套子程序内部可以再定义嵌套子程序。
# 定义嵌套子程序
子过程语法定义为:
procedure_body_clause::=
子函数语法定义为:
function_body_clause::=
嵌套子程序使用规则与约束:
- 嵌套子程序不支持声明与定义分离。
- 嵌套子程序不支持ACCESSIBLE BY/DEFAULT COLLATIOIN/AUTHID属性。
- 嵌套子程序不支持重载。
- 嵌套子程序的生命周期只在定义的过程体范围内。
- 如果嵌套子程序定义在独立的存储过程/函数,或高级包、UDT对象里的存储过程/函数中,则会被一起持久化到数据库中。
- 当多个语句块嵌套时,如果发生嵌套子程序名冲突,将以最近一层语句块定义的子程序为准。
# 调用嵌套子程序
子过程调用格式为:
procedure_name(arguments);
arguments为与argument_define一一对应的实参。
子函数调用格式为:
variable_name := procedure_name(arguments);
示例1
DECLARE
VAR1 INT;
PROCEDURE YA_NT_PROC(A1 INT, A2 INT) IS
BEGIN
VAR1 := A1 + A2;
END;
BEGIN
YA_NT_PROC(1,2);
DBMS_OUTPUT.PUT_LINE(VAR1);
END;
/
--result
3
示例2(单机、共享集群部署)
CREATE OR REPLACE PROCEDURE YA_PROC1 IS
SUM1 INT;
FUNCTION YA_NT_FUN(A1 INT, A2 INT) RETURN INT IS
BEGIN
DBMS_OUTPUT.PUT_LINE(A1);
DBMS_OUTPUT.PUT_LINE(A2);
RETURN A1 + A2;
END;
BEGIN
SUM1 := YA_NT_FUN(7, 9);
DBMS_OUTPUT.PUT_LINE(SUM1);
END;
/
BEGIN
YA_PROC1();
END;
/
--result
7
9
16