表 (相當於數組)
定義一個表類型的文法如下:
TYPE tabletype IS TABLE OF type INDEX BY BINARY_INTEGER
其中Tabletype是被定義的表類型的名,Type是預定義的標量類型或者%TYPE來引用的標量類型。表的索引是BINARY_INTEGER類型,當定義了表類型後,就可以聲明該類型的變數了。
--定義表類型t_NameTable,其元素類型是auths資料庫表中的name列的類型
TYPE t_NameTable IS TABLE OF auths.name%TYPE
INDEX BY BINARY_INTEGER;
--定義表類型t_Address,其元素類型是auths表中的address列的類型
TYPE t_AddressTable IS TABLE OF auths.address%TYPE
INDEX BY BINARY_INTEGER;
--聲明兩個表類型變數
v_name t_NameATable;
v_Address t_AddressTable;
當定義了表類型,並聲明了這個類型變數後,就可以通過下面的文法應用PLSQL表中的元素了:
tablename(index);
其中tablename是表明,index是表的索引,它用BINARY_INTEGER類型的變數或是能夠轉換成BINARY_INTEGER類型的運算式表示.
使用上面的表,為表元素賦值:
BEGIN
v_Name(2) := 'Wang';
v_Address(-3) := 'streetr 1';
END;
eg2:
DECLARE
TYPE t_AuthorRecord IS TABLE OF auths%ROWTYPE
INDEX BY BINARY_INTEGER;
v_Auths t_AuthorRecord;
BEGIN
SELECT *
INTO v_Auths(00009)
FROM auths
WHERE author_code = 'A00009';
END;
因為v_Auths表中的每一個元素都是記錄,所以可以通過下面的文法引用記錄中的域
table(index).field
記錄表在相當程度上提高了PLSQL表的功能,因為一個記錄表就可以存放一個資料庫表中的所有資訊。
PLSQL表與數組一樣,當時表的實際結構與數組是不一樣的,它與C中的數組有以下不同:
1)PLSQL表中的元素沒有特定的順序,因為表中的元素不像數組一樣被連續地儲存在一個空間內。
2)在PLSQL表中的KEY不必是連續的,任意BINARY_INTEGER類型的值或是運算式都可以作為表的索引(key列)。
3)當向一個PLSQL表中插入一個元素時,就為該表分配了用以存放該元素的儲存空間。plsql表的大小是沒有限制的。
表屬性
PLSQL中,不僅引入了表,而且通過了表屬性擴充了PLSQL表的功能,使用表屬性的文法是:
table.attribute
文法 傳回型別 描述
Table.COUNT NUMBER 返回PLSQL表中元素個數
Table.DELETE N/A 刪除PLSQL表中所有元素
Table.DELETE(i) N/A 刪除PLSQL表中索引號為i指定的元素
Table.DELETE(i,j) N/A 刪除PLSQL表中索引號i到j之間(包括i和j)指定的元素
Table.EXISTS(i) BOOLEAN 如果PLSQL表中索引號為i的元素存在,則返回TRUE
Table.FIRST BINARY_INTEGER 返回PLSQL表中最後一個元素(索引號最小)的索引
Table .LAST BINARY_INTEGER 返回PLSQL表中最後一個元素(索引號最大)的索引
Table.NEXT(i) BINARY_INTEGER 返回PLSQL表中索引號為i的元素的後繼一個元素的索引
Table.PRIOR (i) BINARY_INTEGER 返回PLSQL表中索引號i的元素的前一個元素的索引
表中的索引號從1開始,每增加一個元素,索引號隨之增加1,也就是說索引號為1的下一個元素的索引號是2,再下一個元素的索引號為3,以此類推,使用這樣的方法建立的PLSQL表,其表元素在控制結構體中的迴圈實現起來更簡單,當PLSQL塊在Pro*C或OCI程式中北調用或被嵌入時,使用上述所有方法建立的PLSQL表能綁定到C語言的數組上.