在本章中,我們將討論學(xué)習(xí)PL/SQL中的數(shù)組。 PL/SQL編程語言提供了一種稱為VARRAY的數(shù)據(jù)結(jié)構(gòu),它可以存儲相同類型的元素的固定大小順序集合。varray用于存儲有序的數(shù)據(jù)集合,但通常最好將數(shù)組視為相同類型變量的集合。
所有varray是由連續(xù)的內(nèi)存位置組成。最低的地址對應(yīng)于第一個元素,而最后一個元素的地址最高。參考以下圖示 -
數(shù)組是集合類型數(shù)據(jù)的一部分,表示可變大小的數(shù)組。 我們將在后面的“PL/SQL集合”這一章中學(xué)習(xí)其他集合類型。
varray中的每個元素都具有與之相關(guān)聯(lián)的索引。它還具有可以動態(tài)更改的容量(大小)。
使用CREATE TYPE語句創(chuàng)建varray類型。必須指定存儲在varray中的元素的最大容量(大小)和類型。
在模式(schema)級創(chuàng)建VARRAY類型的基本語法是 -
CREATE OR REPLACE TYPE varray_type_name IS VARRAY(n) of <element_type>
SQL
其中,
可以使用ALTER TYPE語句更改變量的最大大小。
例如,
CREATE Or REPLACE TYPE namearray AS VARRAY(3) OF VARCHAR2(10);
/
SQL
在PL/SQL塊中創(chuàng)建VARRAY類型的基本語法是 -
TYPE varray_type_name IS VARRAY(n) of <element_type>
SQL
例如 -
TYPE namearray IS VARRAY(5) OF VARCHAR2(10);
Type grades IS VARRAY(5) OF INTEGER;
SQL
下面讓我們來看幾個例子來更好地理解這個概念 -
實例-1
以下程序說明了如何使用varrays -
SET SERVEROUTPUT ON SIZE 99999;
DECLARE
type namesarray IS VARRAY(5) OF VARCHAR2(10);
type grades IS VARRAY(5) OF INTEGER;
names namesarray;
marks grades;
total integer;
BEGIN
names := namesarray('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz');
marks:= grades(98, 97, 78, 87, 92);
total := names.count;
dbms_output.put_line('Total '|| total || ' Students');
FOR i in 1 .. total LOOP
dbms_output.put_line('Student: ' || names(i) || '
Marks: ' || marks(i));
END LOOP;
END;
/
SQL
當(dāng)上述代碼在SQL提示符下執(zhí)行時,它會產(chǎn)生以下結(jié)果 -
請注意 -
示例-2
變量的元素也可以是任何數(shù)據(jù)庫表的%ROWTYPE或任何數(shù)據(jù)庫表字段的%TYPE表來引用表示。 以下示例說明了這個概念。
將使用數(shù)據(jù)庫中存儲的CUSTOMERS表,結(jié)構(gòu)和數(shù)據(jù)如下所示 -
CREATE TABLE customers
( id number(10) NOT NULL,
name varchar2(50) NOT NULL,
age number(2) NOT NULL,
address varchar2(50),
salary float(2) NOT NULL,
CONSTRAINT customers_pk PRIMARY KEY (id)
);
INSERT INTO customers (id,name,age,address,salary) VALUES(1, '羅大牛',32,'北京', 22999.00);
INSERT INTO customers (id,name,age,address,salary) VALUES(2, 'Maxsu',25,'???, 5999.00);
INSERT INTO customers (id,name,age,address,salary) VALUES(3, 'Hinew',22,'廣州', 9800.98);
INSERT INTO customers (id,name,age,address,salary) VALUES(4, '李小路',26,'北京', 18700.00);
INSERT INTO customers (id,name,age,address,salary) VALUES(5, '張友德',28,'上海', 18999.00);
INSERT INTO customers (id,name,age,address,salary) VALUES(6, '李連定',42,'深圳', 32999.00);
SQL
以下示例使用游標(biāo)引用(有關(guān)游標(biāo)將在單獨(dú)的章節(jié)中詳細(xì)介紹和學(xué)習(xí))。參考以下代碼 -
SET SERVEROUTPUT ON SIZE 99999;
DECLARE
CURSOR c_customers is
SELECT name FROM customers;
type c_list is varray (6) of customers.name%type;
name_list c_list := c_list();
counter integer :=0;
BEGIN
FOR n IN c_customers LOOP
counter := counter + 1;
name_list.extend;
name_list(counter) := n.name;
dbms_output.put_line('Customer('||counter ||'):'||name_list(counter));
END LOOP;
END;
/
SQL
當(dāng)上述代碼在SQL提示符下執(zhí)行時,它會產(chǎn)生以下結(jié)果 -
更多建議: