定義集合類型

要使用集合,我們首先要創建集合類型,然後聲明該類型的變量。我們可以在任何PL/SQL塊、子程序或包的聲明部分使用TABLE和VARRAY類型。

集合的作用域和初始化規則同其他類型和變量一樣。在一個塊或子程序中,當程序進入塊或子程序時集合被初始化,退出時銷燬。在包中,集合在我們第一次引用包的時候初始化,直至會話終止時才銷燬。

· 嵌套表

對於嵌套表,可以使用下面的語法來進行定義:

TYPE type_name IS TABLE OF element_type [NOT NULL];

其中type_name是在集合聲明使用的類型標識符,而element_type可以是除了REF CURSOR類型之外的任何PL/SQL類型。對於使用SQL聲明的全局嵌套表來說,它的元素類型受到一些額外的限制。以下幾種類型是不可以使用的:

1.   BINARY_INTEGER, PLS_INTEGER

2.   BOOLEAN

3.   LONG, LONG RAW

4.   NATURAL, NATURALN

5.   POSITIVE, POSITIVEN

6.   REF CURSOR

7.   SIGNTYPE

8.   STRING

· 變長數組

對於變長數組類型,可以使用下面的語法進行定義:

TYPE
  type_name IS {VARRAY | VARYING ARRAY} (size_limit) OF 
  element_type [NOT NULL];

type_name和element_type的含義與嵌套表相同。size_limit是正整數,代表數組中最多允許存放元素的個數。在定義VARRAY時,我們必須指定它的長度最大值。下例中,我們定義了一個存儲366個DATE類型的VARRAY:

DECLARE 
  TYPE
 Calendar IS VARRAY(366) OF DATE;

· 關聯數組

對於關聯數組,可以使用下面的語法進行定義:

TYPE type_name IS TABLE OF element_type [NOT NULL]
  INDEX BY [BINARY_INTEGER | PLS_INTEGER | VARCHAR2(size_limit)];
  INDEX BY key_type;

key_type可以是BINARY_INTEGER或PLS_INTEGER,也可以是VARCHAR2或是它的子類型VARCHAR、 STRING或LONG。在用VARCHAR2做鍵的時候,我們必須指定VARCHAR2的長度,但這裏不包括LONG類型,因爲LONG等價於 VARCHAR2(32760)。而RAW、LONG RAW、ROWID、CHAR和CHARACTER都是不允許作爲關聯數組的鍵的。在引用一個使用VARCHAR2類型作爲鍵的關聯數組中的元素時,我們還可以使用其他類型,如DATE或TIMESTAMP,因爲它們自動地會被TO_CHAR函數轉換成VARCHAR2。索引表可以使用不連續的鍵作下標索引。如下例中,索引表的下標是7468而不是1:

DECLARE
  TYPE
 emptabtyp IS TABLE OF emp%ROWTYPE
    INDEX BY BINARY_INTEGER
;

  emp_tab   emptabtyp;
BEGIN
  /* Retrieve employee record. */
  SELECT *
    INTO emp_tab(7468)
    FROM emp
   WHERE empno = 7468;
END;

1、定義與PL/SQL集合類型等價的SQL類型

要把嵌套表或變長數組存到數據表中,我們必須用CREATE TYPE來創建SQL類型。SQL類型可以當作數據表的字段或是SQL對象類型的屬性來使用。

我們可以在PL/SQL中聲明與之等價的類型,或在PL/SQL變量聲明時直接使用SQL類型名。

· 嵌套表的例子

下面的SQL*Plus腳本演示瞭如何在SQL中創建嵌套表,並把它作爲對象類型的屬性來使用:

CREATE TYPE CourseList AS TABLE OF VARCHAR2(10)   -- define type
/
CREATE TYPE Student AS OBJECT (   -- create object
  id_num INTEGER(4),
  name VARCHAR2(25),
  address VARCHAR2(35),
  status CHAR(2),
  courses CourseList)   -- declare nested table as attribute
/

標識符courses代表整張嵌套表,courses中的每個元素存放一個大學課程的代號,如"Math 1020"。

· 變長數組的例子

下面的腳本創建了能夠存儲變長數組的數據庫字段,其中每個元素包含一個VARCHAR2類型值:

 -- Each project has a 16-character code name.
 -- We will store up to 50 projects at a time in a database column.


CREATE TYPE projectlist AS VARRAY(50) OF VARCHAR2(16);
/

CREATE  TABLE department (   -- create database table
    dept_id NUMBER(2),
    NAME VARCHAR2(15),
    budget NUMBER(11,2),
    -- Each department can have up to 50 projects.
    projects     projectlist)
/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章