PLSQL复合变量
复合变量指用于存放多个值的变量。定义复合变量时,必须要使用PL/SQL的复合数据类型。PL/SQL包括
PL/SQL记录、PL/SQL表、嵌套表及VARRAY等四种复合数据类型。
1、PLSQL记录
每个PL/SQL记录一般都包含多个成员,当使用PL/SQL记录时,需要注意在定义部分定义记录类型和记录变量,然后在执行部分引用该记录变量。
实例:
DECLARE
TYPE emp_record_type IS RECORD(
name emp.ename%TYPE,
salary emp.sal%TYPE,
title emp.job%TYPE);
emp_record emp_record_type;
BEGIN
SELECT ename,sal,job INTO emp_record FROM emp WHERE empno=7788;
dbms_output.put_line('雇员名:'||emp_record.name);
END;
注:emp_record_type是记录类型,emp_record是记录变量,emp_record.name表示引用记录变量emp_record的成员name。
2、PL/SQL表(索引表)
与高级语言数组不同,PL/SQL表的元素个数没有限制,并且其下标没有上下限。当使用PL/SQL表时,必须先在定义部分定义PL/SQL表类型和PL/SQL
表变量,然后在执行部分引用该PL/SQL表变量。
实例:
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=7788;
dbms_output.put_line('雇员名:'||ename_table(-1)) ;
END;
注:ename_table_type表示表类型;emp.ename%TYPE指定了PL/SQL表元素的数据类型和长度;ename_table表示表变量;ename_table(-1)表示下标
为-1的元素。
DECLARE
TYPE area_table_type IS TABLE OF NUMBER INDEX BY VARCHAR2(10);
area_table area_table_type;
BEGIN
area_table('北京') := 1;
area_table('上海') := 2;
area_table('广州') := 3;
dbms_output.put_line('第一个元素:' || area_table.first);
dbms_output.put_line('第一个元素:' || area_table.last);
END;
第一个元素:北京
第一个元素:上海
3、嵌套表
嵌套表类似于高级语言数组。需要注意,高级语言和嵌套表的下标都不能为负值;高级语言数组元素个数有限制,但嵌套表的元素个数没有限制。
嵌套表与PL/SQL表非常相似,但嵌套表可以作为表列的数据类型,而PL/SQL表不能作为表列的数据类型。当在表中使用嵌套表时,必须先使用
CREATE TYPE语句建立嵌套表类型。
实例:
CREATE OR REPLACE TYPE emp_type AS OBJECT(
name VARCHAR2(10),salary NUMBER(6,2),hiredate DATE);--创建对象类型
CREATE OR REPLACE TYPE emp_array IS TABLE OF emp_type;--创建嵌套表类型
当在PL/SQL块中使用嵌套表变量时,必须首先使用构造方法初始化嵌套表变量,然后才能在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;
--ename_table_type()为构造方法
--在表列中使用嵌套表
deptno NUMBER(2),dname VARCHAR2(10),employee emp_array
) NESTED TABLE employee STORE AS employee;--当使用嵌套表类型作为表列时必须指定专门的存储表
4、VARRAY
VARRAY类似于嵌套表,它可以作为表列和对象类型属性的数据类型。但是需要注意,嵌套表的元素个数没有限制,而VARRAY得元素个数是有限制的。
使用VARRAY时,必须先建立VARRAY类型。与嵌套表类似,在PL/SQL块中使用时,必须先使用构造方法初始化数组变量,然后才能在PL/SQL块内引用数组元素。
实例:
CREATE TYPE article_type AS OBJECT(
title VARCHAR2(30),pubdate DATE
);
CREATE TYPE article_array IS VARRAY(20) OF article_type;
当建立了VARRAY类型之后,可以在表列或对象属性中将其作为用户自定义数据类型来引用:
CREATE TABLE author(
id NUMBER(6),name VARCHAR2(10),article article_array
);
--注:嵌套表数据需要存储在专门的存储表中,而VARRAY数据则与其他列数据一起存放在表段中。
参照变量
参照变量指用于存放数值指针的变量。通过使用参照变量,可以使得应用程序共享相同对象,降低占用空间。在编写Pl/sql程序时,可以使用游标
变量(REF CURSOR)和对象类型变量REF obj_type等两种参照变量类型。
1、REF CURSOR
当使用显式游标时,需要在定义显式时指定相应的SELECT语句,这种显式游标称为静态游标。当使用变量变量时,定义游标变量时不需要指定
SELECT语句,而是在打开游标时指定SELECT语句,从而实现动态的游标操作。
实例:
DECLARE
type cl IS REF CURSOR;
emp_cursor cl;
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
BEGIN
OPEN emp_cursor FOR
SELECT ename,sal FROM emp WHERE deptno=10;
LOOP
FETCH emp_cursor INTO v_ename,v_sal;
EXIT WHEN emp_cursor%NOTFOUND;
dbms_output.put_line(v_ename);
END LOOP;
CLOSE emp_cursor;
END;
注:cl为 REF CURSOR类型,而emp_cursor 为游标变量,并且再打开游标时指定了其对应的SELECT语句。
2、REF obj_type
当编写对象类型应用时,为了共享相同对象,可以使用REF引用对象类型,REF实际是指向对象实例的指针。
实例:
CREATE OR REPLACE TYPE home_type AS OBJECT(
street VARCHAR2(50),city VARCHAR2(20),state VARCHAR2(20),zipcode VARCHAR2(6),owner VARCHAR2(10)
);
CREATE TABLE homes OF home_type;--利用对象类型创建了对象表homes
CREATE TABLE person(
id NUMBER(6) PRIMARY KEY,
name VARCHAR2(10),addr REF home_type --引用对象
);