#嵌套子程序

在PL语句块声明部分可以定义子程序。

嵌套子程序可以是过程体或函数,可以在匿名块、存储过程、自定义函数、自定义高级包等PL对象的声明部分进行定义。

嵌套子程序内部可以再定义嵌套子程序。

# 定义嵌套子程序

子过程语法定义为:

syntax
PROCEDURE procedure_name ( argument_define , ) IS AS procedure_body_clause ;

procedure_body_clause::=

syntax
variable_declare BEGIN plsql_statements END procedure_name

子函数语法定义为:

syntax
FUNCTION function_name ( argument_define , ) RETURN return_datatype IS AS function_body_clause ;

function_body_clause::=

syntax
variable_declare BEGIN plsql_statements END function_name

嵌套子程序使用规则与约束:

  • 嵌套子程序不支持声明与定义分离。
  • 嵌套子程序不支持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
pdf-btn 下载文档
copy-btn 复制链接