Skip to content

嵌套子程序

在匿名块内、包内或模式级别创建的子程序是嵌套子程序,只有在包的子程序或独立子程序中的嵌套子程序是存储在数据库中,匿名块内创建的嵌套子程序仅在当前块内有效。

注意:

嵌套子程序结束时必须显式指示结束的程序名。

示例

在匿名块中嵌套子程序

sql
DECLARE    -- 匿名块的声明区开始
  v1 INT;
  v2 VARCHAR2;
BEGIN    -- 匿名块的执行区开始
  PROCEDURE subpro_1(c1 INT,c2 VARCHAR2)-- 声明并定义嵌套子过程
  IS                            -- 嵌套子过程声明区开始
    sub_v1 INT;
    sub_v2 VARCHAR2(30) := ' ';
  BEGIN                           -- 嵌套子过程执行区开始
    sub_v1 := v1 + c1;
    sub_v2 := v2 || c2;
    v1:=sub_v1;
    v2:=sub_v2;
    SEND_MSG('v1='||sub_v1);
    SEND_MSG('v2='||sub_v1);
  END subpro_1;                  -- 嵌套子过程执行区结束
  v1 := 1;
  v2 := 'AA';
  subpro_1(v1,v2);
END;  -- 匿名块的执行区结束
/

在包的子程序中嵌套子程序

sql
--创建包头
CREATE OR REPLACE PACKAGE pack_2
AS
  v1 INT;
  v2 VARCHAR2;
  PROCEDURE pro_1(c1 INT,c2 VARCHAR2);        -- 在包头中声明子程序
  FUNCTION func_1(c1 INT,c2 VARCHAR2) RETURN INT; -- 在包头中声明子程序
END;

--创建包体
CREATE OR REPLACE PACKAGE BODY pack_2
AS
  PROCEDURE pro_1(c1 INT,c2 VARCHAR2)        -- 在包体中定义子程序
  AS
  id INT;
  name VARCHAR2;
  BEGIN
    PROCEDURE subpro_1(c1 INT,c2 VARCHAR2)-- 声明并定义嵌套子过程
    IS                            -- 嵌套子过程声明区开始
      sub_v1 INT;
      sub_v2 VARCHAR2(30) := ' ';
    BEGIN                           -- 嵌套子过程执行区开始
      sub_v1 := v1 + c1;
      sub_v2 := v2 || c2;
      v1:=sub_v1;
      v2:=sub_v2;
      SEND_MSG('v1='||sub_v1);
      SEND_MSG('v2='||sub_v1);
    END subpro_1;                  -- 嵌套子过程执行区结束
    v1 := 1;
    v2 := 'sub_procedure';
    subpro_1(v1,v2);
  END pro_1;
  FUNCTION func_1(c1 INT,c2 VARCHAR2) RETURN INT -- 在包体中定义子程序
  AS
  id INT;
  name VARCHAR2;
  BEGIN
    FUNCTION subfunc_1(c1 int,c2 VARCHAR2) RETURN INT
    IS                            -- 嵌套子过程声明区开始
      sub_v1 INT;
      sub_v2 VARCHAR2(30) := ' ';
    BEGIN                           -- 嵌套子过程执行区开始
      sub_v1 := v1 + c1;
      sub_v2 := v2 || c2;
      v1:=sub_v1;
      v2:=sub_v2;
      SEND_MSG('v1='||sub_v1);
      SEND_MSG('v2='||sub_v1);
      RETURN sub_v1;
    END subfunc_1;                  -- 嵌套子过程执行区结束
    v1 := 1;
    v2 := 'sub_function';
    v1:=subfunc_1(v1,v2);               -- 执行嵌套子过程
  END func_1;
END pack_2;
/

在独立程序中嵌套子程序

sql
CREATE OR REPLACE FUNCTION func_1(c1 INT,c2 VARCHAR2) RETURN INT
  AS
  id INT;
  name VARCHAR2;
  BEGIN
    FUNCTION subfunc_1(c1 int,c2 VARCHAR2) RETURN INT
    IS                            -- 嵌套子过程声明区开始
      sub_v1 INT;
      sub_v2 VARCHAR2(30) := ' ';
    BEGIN                           -- 嵌套子过程执行区开始
      sub_v1 := id + c1;
      sub_v2 := name || c2;
      id:=sub_v1;
      name:=sub_v2;
      SEND_MSG('v1='||sub_v1);
      SEND_MSG('v2='||sub_v1);
      RETURN sub_v1;
    END subfunc_1;                  -- 嵌套子过程执行区结束
    id := 1;
    name := 'sub_function';
    RETURN subfunc_1(id,name);        -- 执行嵌套子过程
END func_1;
/