变长数组与嵌套表一样,需要使用构造方法进行初始化,否则其值将为NULL。
定义构造函数既可以在语句块的声明部分,也可以在语句块的执行体部分。
在构造函数中创建的初始值将从1开始安排索引,如果访问索引之外的元素,
Oracle将会抛出下标超出数量的错误。与嵌套表相同的是可以使用EXTEND来
扩展范围,但是必须注意的是,EXTEND不能超过变长数组的最大长度。
DECLARE
TYPE projectlist IS VARRAY(50) OF VARCHAR2 (16);--定义项目列表变长数组
TYPE empno_type IS VARRAY(10) OF NUMBER(4);--定义员工编号变长数组
--声明变长数组类型的变量,并使用构造函数进行初始化
project_list projectlist := projectlist('网站','ERP','CRM','CMS');
empno_list empno_type;--声明变长数组类型的变量
BEGIN
DBMS_OUTPUT.PUT_LINE(project_list(3));--输出第3个元素的值
project_list.EXTEND; --扩展到第5个元素
project_list(5) := 'WORKFLOW'; --为第5个元素赋值
empno_list := empno_type(7011,7012,7013,7014,null,null,null,null,null,null);
--为第9个元素赋初值
empno_list(9):= 8011;
DBMS_OUTPUT.PUT_LINE(emp_list(9));--输出第9个元素的值
END;
8.2.9数据库中的变长数组
和嵌套表一样,变长数组也可以作为数据库表的列数据被存储到数据库中,在使用前,必须先使用
CREATE TYPE语句在数据字典中创建一个变长数组的类型,语法如下:
CREATE OR REPLACE TYPE empname_varray_type IS VARRAY(20) OF VARCHAR2(20);
CREATE TABLE dept_varray
(deptno NUMBER(2),
dname VARCHAR2(20),
emplist empname_varray_type
);
在代码中,empname_varray_type是一个具有20个元素的VARCHAR2类型的变长数组,在定义CREATE
TABLE语句时,直接使用这个创建的empname_varray_type类型作为其列类型,可以看到,在使用
变长数组的列中,并没有指定STORE AS 来指定变长数组的存储表,这是因为变长数组的存储组织与数据库
行是完全相同的,数据是作为数据库表数据进行存储的,因为不需要指定一个存储表的名字进行存储。
操纵变长数组列:
DECLARE
emp_list empname_varray_type := empname_varray_type
('史密斯','杰克','汤姆','丽莎','简','史泰龙');
BEGIN
INSERT INTO dept_varray
VALUES (20,'维修组','emp_list');--向表中插入变长数组数据
INSERT INTO dept_varray --直接在INSERT语句中初始化变长数组数据
VALUES (30,'机加工',
empname_varray_type('张3','刘七','赵五','阿4','阿5','阿6'));
SELECT emplist
INTO emp_list
FROM dept_varray
WHERE deptno = 20;--使用SELECT语句从表中取出变长数组数据
emp_list(1) := '杰克张';--更新变长数组数据的内容
UPDATE dept_varray
SET emplist = emp_list
WHERE deptno = 20;--使用UPDATE语句更新变长数组数据
DELETE FROM dept_varray--删除记录同时删除变长数组数据
WHERE deptno = 30;
END;
定义构造函数既可以在语句块的声明部分,也可以在语句块的执行体部分。
在构造函数中创建的初始值将从1开始安排索引,如果访问索引之外的元素,
Oracle将会抛出下标超出数量的错误。与嵌套表相同的是可以使用EXTEND来
扩展范围,但是必须注意的是,EXTEND不能超过变长数组的最大长度。
DECLARE
TYPE projectlist IS VARRAY(50) OF VARCHAR2 (16);--定义项目列表变长数组
TYPE empno_type IS VARRAY(10) OF NUMBER(4);--定义员工编号变长数组
--声明变长数组类型的变量,并使用构造函数进行初始化
project_list projectlist := projectlist('网站','ERP','CRM','CMS');
empno_list empno_type;--声明变长数组类型的变量
BEGIN
DBMS_OUTPUT.PUT_LINE(project_list(3));--输出第3个元素的值
project_list.EXTEND; --扩展到第5个元素
project_list(5) := 'WORKFLOW'; --为第5个元素赋值
empno_list := empno_type(7011,7012,7013,7014,null,null,null,null,null,null);
--为第9个元素赋初值
empno_list(9):= 8011;
DBMS_OUTPUT.PUT_LINE(emp_list(9));--输出第9个元素的值
END;
8.2.9数据库中的变长数组
和嵌套表一样,变长数组也可以作为数据库表的列数据被存储到数据库中,在使用前,必须先使用
CREATE TYPE语句在数据字典中创建一个变长数组的类型,语法如下:
CREATE OR REPLACE TYPE empname_varray_type IS VARRAY(20) OF VARCHAR2(20);
CREATE TABLE dept_varray
(deptno NUMBER(2),
dname VARCHAR2(20),
emplist empname_varray_type
);
在代码中,empname_varray_type是一个具有20个元素的VARCHAR2类型的变长数组,在定义CREATE
TABLE语句时,直接使用这个创建的empname_varray_type类型作为其列类型,可以看到,在使用
变长数组的列中,并没有指定STORE AS 来指定变长数组的存储表,这是因为变长数组的存储组织与数据库
行是完全相同的,数据是作为数据库表数据进行存储的,因为不需要指定一个存储表的名字进行存储。
操纵变长数组列:
DECLARE
emp_list empname_varray_type := empname_varray_type
('史密斯','杰克','汤姆','丽莎','简','史泰龙');
BEGIN
INSERT INTO dept_varray
VALUES (20,'维修组','emp_list');--向表中插入变长数组数据
INSERT INTO dept_varray --直接在INSERT语句中初始化变长数组数据
VALUES (30,'机加工',
empname_varray_type('张3','刘七','赵五','阿4','阿5','阿6'));
SELECT emplist
INTO emp_list
FROM dept_varray
WHERE deptno = 20;--使用SELECT语句从表中取出变长数组数据
emp_list(1) := '杰克张';--更新变长数组数据的内容
UPDATE dept_varray
SET emplist = emp_list
WHERE deptno = 20;--使用UPDATE语句更新变长数组数据
DELETE FROM dept_varray--删除记录同时删除变长数组数据
WHERE deptno = 30;
END;