Oracle中复杂数据类型–集合
集合是用来处理多行单列的数据,记录是用来处理单行多列,变量处理单行单列数据,PL/SQL记录表处理多行多列数据
1.索引表
下标可以为负数,并且元素的个数没有限制,只能作为PL/SQL复合数据类型使用.
TYPE type_name IS TABLE OF element_type
[NOT NULL] INDEX BY key_type;
identifier type_name;
type_name用于指定用户自定义数据类型的名称(IS TABLE .. INDEX表示索引表),element_type用于指定索引表元素的数据类型.NOT NULL表示不能引用NULL元素.
key_type用于指定索引表下标的数据类型(BINARY_INTEGER, PLS_INTEGER, VARCHAR2),identifier定义索引表变量
DECLARE
TYPE ename_table_type IS TABLE OF emp.ename%TYPE
INDEX BY BINARY_INTEGER;
ename_table ename_table_type;
BEGIN
SELECT ename INTO ename_table(-1) FROM emp
WHERE empno=&no;
dbms_output.put_line(‘雇员名:’||ename_table(-1));
END;
其中ename_table(-1)表示下标是-1的元素.
DECLARE
TYPE ename_table_type IS TABLE OF NUMBER
INDEX BY VARCHAR2(10);
ename_table ename_table_type;
BEGIN
ename_table(‘北京’) := 1;
END;
2.嵌套表
元素下标从1开始,元素个数没有限制,值可以是稀疏的.可以作为表列的数据类型使用.
TYPE type_name IS TABLE OF element_type
identifier type_name;
type_name用于指定嵌套表的名字,element_type指定嵌套表元素的数据类型.在使用时,必须先使用构造方法先初始化构造表
(1)在PL/SQL块中使用嵌套表
DECLARE
TYPE ename_table_type IS TABLE OF emp.ename%TYPE;
ename_table ename_table_type
BEGIN
ename_table:=ename_table_type(‘MARY’,’MARY’,’MARY’);
SELECT enmae INTO ename_table(2) FROM emp
WHERE emp_no=&no;
dbms_output.put_line(‘雇员名:’||ename_table(2));
END;
(2)在表列中使用嵌套表
必须先使用CREATE TYPE命令来建立嵌套表类型,当使用嵌套表类型作为表列的数据类型时,必须为嵌套表指定专门的存储表
CREATE TYPE phone_type IS TABLE OF VARCHAR2(20);
CREATE TABLE employee(
id NUMBER(4), name VARCHAR2(10),sal NUMBER(6,2),
phone phone_type)NESTED TABLE phone STORE AS phone_type;
经过上面的定义后,就可以在建立employee的时间使用这个嵌套类型了.
BEGIN
INSERT INTO employee VALUES(1, ‘SCOTT’, 800, phone_type(‘123456′,’13245641234’));
END;
3.变长数组(VARRAY)
下标从1开始,元素的*大个数是有限制的.
TYPE type_name, IS VARRAY(size_limit) OF element_type[NOT NULL];
identifier type_name;
使用的时间必须要用构造方法进行初始化,例如:
DECLARE
TYPE ename_table_type IS VARRAY(20) OF emp.ename%TYPE;
ename_table ename_table_type:=ename_table_type(‘A’,’A’);
BEGIN
SELECT ename INTO ename_table(1) FROM emp
WHERE empno=&no;
dbms_output.put_line(‘雇员姓名:’||ename_table(1));
END;
VARRAY也可以作为列的数据类型使用,在表中引用此数据类型必须先create type
CREATE TYPE phone_type IS VARRAY(20) OF VARCHAR2(20);
CREATE TABLE employee(
id NUMBER(4),
name VARCHAR2(20),
sal NUMBER(6,2),
phone phone_type);