(1)记录类型
--自定义record类型
DECLARE
TYPE example_record_type IS RECORD(
name emp.ename%TYPE,
salary emp.salary%TYPE,
dno emp.deptno%TYPE
);
--声明record类型变量
example_record example_record_type;
BEGIN
--PL/SQL语句
END;
--使用%ROWTYPE属性定义记录变量
%ROWTYPE属性可以基于表或视图定义记录变量。使用该属性定义记录变量时,记录成员的名称和类型与表或视图
列的名称和类型完全相同。
--identifier table_name%ROWTYPE;
--identifier view_name%ROWTYPE;
(2)PL/SQL表
索引表的小表可以为负值,而且其元素个数没有限制。
--语法如下:
TYPE type_name IS TABLE OF elment_type [NOT NULL] INDEX BY key_type;
key_type用于指定索引表元素下标的数据类型(BINARY_INTEGER,PLS_INTEGER,,VARCHAR2);
identifier type_name;
--例:
set serveroutput on
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;
/
(3)嵌套表
嵌套表也是一种用于处理PL/SQL数组的数据类型。嵌套表的元素下标从1开始,并且元素个数没有限制。高级语言的数组元素 值是顺序的,而嵌套表元素的数组元素值可以是稀疏的。
--语法
TYPE type_name IS TABLE OF element_type;
identifier type_name;
--例:
--在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 ename INTO ename_table(2) FROM emp
WHERE empno = &no;
dbms_output.put_line(ename_table(2));
END;
/
--在表列中使用嵌套表
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
)NESTER TABLE phone STORE AS phone_table;
(4)变长数组(VARRAY)
其元素下标从1开始,并且元素的最大个数有限制。
--语法
TYPE type_name IS VARRAY(size_limit) OF element_type [NOT NULL];
identifier type_name;
--例:
--在PL/SQL块中使用变长数组
DECLARE
TYPE ename_table_type IS VARRAY(20) OF emp.ename%TYPE;
ename_table ename_table_type:=ename_table_type("MARY", "MARY", "MARY");;
BEGIN
SELECT ename INTO ename_table(1) FROM emp
WHERE empno = &no;
dbms_output.put_line(ename_table(1));
END;
/
--在表列中使用变长数组
CREATE TYPE phone_type IS VARRAY(20) OF VARCHAR2(20);
/
CREATE TABLE employee(
id NUMBER(4),
name VARCHAR2(10),
sal NUMBER(6,2),
phone phone_type
);