文档

包中定义集合类型

更新时间:

您可以在包(package)中定义变长数组、嵌套表以及关联数组三种集合类型。

注意事项

与局部的集合类型不同的是,该类型会随着包的定义被持久化在系统表中,在包删除时被级联删除。

示例

以下是一个包集合类型和局部集合类型转换的示例。

CREATE OR REPLACE PACKAGE pkg AS
  TYPE NumberList IS TABLE OF NUMBER;
  PROCEDURE print (nums NumberList);
END pkg;

CREATE OR REPLACE PACKAGE BODY pkg AS
  PROCEDURE print (nums NumberList) IS
  BEGIN
    FOR i IN nums.FIRST..nums.LAST LOOP
      RAISE NOTICE '%', nums(i);
    END LOOP;
  END;
END;

DECLARE
  TYPE CharList IS TABLE OF VARCHAR(10);
  n1 pkg.NumberList := pkg.NumberList(1,2); -- 使用包的集合类型
  n2 CharList := CharList('3','4'); -- 使用局部集合类型
BEGIN
  pkg.print(n1); -- 传入包的集合类型的变量
  pkg.print(n2); -- 传入局部变量, 但会根据元素类型进行类型转换
END;

结果显示如下:

NOTICE:  1
NOTICE:  2
NOTICE:  3
NOTICE:  4
DO

以下是一个包集合类型和全局集合类型转换的示例。

-- 声明全局集合类型
CREATE OR REPLACE TYPE NumList IS TABLE OF NUMBER; 

-- 使用上一个示例的包过程
DECLARE
  n NumList := NumList(5,6);
BEGIN
  pkg.print(n);
END;

结果显示如下:

NOTICE:  5
NOTICE:  6
DO