PLSQL复合变量与参照变量

 

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的元素。

    从oracle9i开始,PL/SQL表的下标除了可以使用 BINARY_INTEGER 和 PLS_INTEGER 外,还可以是 VARCHAR2 型。
  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;--创建嵌套表类型

(或者直接创建一个嵌套表类型 CREATE OR REPLACE TYPE tt_type IS TABLE OF varchar2(20))
--在PL/SQL块中使用嵌套表类型
当在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()为构造方法
 
 --在表列中使用嵌套表
 CREATE TABLE department(
   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 --引用对象
   );
  

posted on 2011-03-30 13:49  蓝紫  阅读(5179)  评论(0编辑  收藏  举报