PL/SQL 數(shù)組

2021-08-30 16:01 更新

在本章中,我們將討論學(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)更改的容量(大小)。

創(chuàng)建Varray類型

使用CREATE TYPE語句創(chuàng)建varray類型。必須指定存儲在varray中的元素的最大容量(大小)和類型。

在模式(schema)級創(chuàng)建VARRAY類型的基本語法是 -

CREATE OR REPLACE TYPE varray_type_name IS VARRAY(n) of <element_type>
SQL

其中,

  • varray_type_name是一個有效的屬性名稱;
  • n是varray中元素的數(shù)量(最大值);
  • element_type是數(shù)組元素的數(shù)據(jù)類型。

可以使用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é)果 -


請注意 -

  • 在Oracle環(huán)境中,varrays的起始索引始終為1。
  • 可以使用varray類型的構(gòu)造方法初始化varray元素,該方法與varray具有相同的名稱。
  • varrays是一維數(shù)組。
  • varray在聲明時自動為NULL,并且必須在引用元素之前初始化它。

示例-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é)果 -


 




以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號