集合是一個有序組具有相同的數(shù)據(jù)類型的元素。每個元素進行標識的唯一標表示其在集合中的位置。
PL/SQL提供了三種集合類型:
索引表或關(guān)聯(lián)數(shù)組
嵌套表
可變大小的數(shù)組或變長數(shù)組
Oracle文檔提供了每種類型的集合的以下特征:
集合類型 | 元素數(shù)量 | 下標類型 | 密集或稀疏 | 在哪里創(chuàng)建 | 可以是對象類型屬性 |
---|---|---|---|---|---|
關(guān)聯(lián)數(shù)組(或索引表) | 無界 | 字符串或整數(shù) | 兩種都可以 | 只有在PL/SQL塊 | No |
嵌套表 | 無界 | 整數(shù) | 開始密集,可以變得稀疏 | 無論是在PL/SQL塊或模式級別 | Yes |
可變大小的數(shù)組(變長數(shù)組) | 有界 | 整數(shù) | 總是密集 | 無論是在PL/SQL塊或模式級別 | Yes |
我們已經(jīng)在前討論變長數(shù)組參見'PL/SQL數(shù)組“。在本章中將討論PL/SQL表。
這兩種類型的PL/SQL表即,索引表和嵌套表,都具有相同的結(jié)構(gòu)以及行使用下標符號訪問。然而,這兩種類型的表有不同一個方面:嵌套表可以存儲在數(shù)據(jù)庫中的列,但索引表不能。
一個索引表(也叫關(guān)聯(lián)數(shù)組)是一組鍵 - 值對。每個鍵是唯一的,并且用于定位對應(yīng)的值。鍵可以是整數(shù)或字符串。
使用以下語法創(chuàng)建一個索引表。在這里,我們正在創(chuàng)建一個索引表命名表名,它的鍵是subscript_type類型以及對應(yīng)值為 element_type 類型
TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY subscript_type; table_name type_name;
下面的示例演示如何創(chuàng)建一個表來存儲整數(shù)值和鍵名稱,它打印的名稱相同的列表。
DECLARE TYPE salary IS TABLE OF NUMBER INDEX BY VARCHAR2(20); salary_list salary; name VARCHAR2(20); BEGIN -- adding elements to the table salary_list('Rajnish') := 62000; salary_list('Minakshi') := 75000; salary_list('Martin') := 100000; salary_list('James') := 78000; -- printing the table name := salary_list.FIRST; WHILE name IS NOT null LOOP dbms_output.put_line ('Salary of ' || name || ' is ' || TO_CHAR(salary_list(name))); name := salary_list.NEXT(name); END LOOP; END; /
當上述代碼在SQL提示符執(zhí)行時,它產(chǎn)生了以下結(jié)果:
Salary of Rajnish is 62000 Salary of Minakshi is 75000 Salary of Martin is 100000 Salary of James is 78000 PL/SQL procedure successfully completed.
一個索引表的元素也可以是任何數(shù)據(jù)庫表字段%TYPE或任何數(shù)據(jù)庫表%ROWTYPE。下面的例子說明了這個概念。我們將使用存儲在數(shù)據(jù)庫中CUSTOMERS表:
Select * from customers; +----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 32 | Ahmedabad | 2000.00 | | 2 | Khilan | 25 | Delhi | 1500.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 4 | Chaitali | 25 | Mumbai | 6500.00 | | 5 | Hardik | 27 | Bhopal | 8500.00 | | 6 | Komal | 22 | MP | 4500.00 | +----+----------+-----+-----------+----------+
DECLARE CURSOR c_customers is select name from customers; TYPE c_list IS TABLE of customers.name%type INDEX BY binary_integer; name_list c_list; counter integer :=0; BEGIN FOR n IN c_customers LOOP counter := counter +1; name_list(counter) := n.name; dbms_output.put_line('Customer('||counter|| '):'||name_list(counter)); END LOOP; END; /
當上述代碼在SQL提示符執(zhí)行