程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 全面探討PL/SQL的復合數據類型

全面探討PL/SQL的復合數據類型

編輯:關於SqlServer
 PL/SQL有兩種復合數據結構:記錄和集合。記錄由不同的域組成,集合由不同的元素組成。在本文中我們將討論記錄和集合的類型、怎樣定義和使用記錄和集合。

  PL/SQL 記錄

  記錄是PL/SQL的一種復合數據結構,scalar數據類型和其他數據類型只是簡單的在包一級進行預定義,但復合數據類型在使用前必須被定義,記錄之所以被稱為復合數據類型是因為他由域這種由數據元素的邏輯組所組成。域可以是scalar數據類型或其他記錄類型,它與c語言中的結構相似,記錄也可以看成表中的數據行,域則相當於表中的列,在表和虛擬表(視圖或查詢)中非常容易定義和使用,行或記錄中的每一列或域都可以被引用或單獨賦值,也可以通過一個單獨的語句引用記錄所有的域。在存儲過程或函數中記錄也可能有參數。

  創建記錄

  在PL/SQL中有兩種定義方式:顯式定義和隱式定義。一旦記錄被定義後,聲明或創建定義類型的記錄變量,然後才是使用該變量。隱式聲明是在基於表的結構或查詢上使用%TYPE屬性,隱式聲明是一個更強有力的工具,這是因為這種數據變量是動態創建的。

  顯式定義記錄

  顯式定義記錄是在PL/SQL程序塊中創建記錄變量之前在聲明部分定義。使用type命令定義記錄,然後在創建該記錄的變量。語法如下:

TYPE record_type IS RECORD (fIEld_definition_list);
  fIEld_definition_list是由逗號分隔的列表。

  域定義的語法如下:
fIEld_name data_type_and_size [NOT NULL][{:=|DEFAULT} default_value]
  域名必須服從與表或列的命名規則相同的命名規則。下面我們看一個例子:

DELCARE
TYPE stock_quote_rec IS RECORD
(symbol stock.symbol%TYPE
,bid NUMBER(10,4)
,ask NUMBER(10,4)
,volume NUMBER NOT NULL:=0
,Exchange VARCHAR2(6) DEFAULT 'NASDAQ'
);

real_time_quote stock_quote_rec;
variable
  域定義時的%TYPE屬性用於引用數據庫中的表或視圖的數據類型和大小,而在此之前程序不知道類型和大小。在上面的例子中記錄域在編譯時將被定義為與列SYMBOL相同的數據類型和大小,當代碼中要使用來自數據庫中的數據時,在變量或域定義中最好使用%TYPE來定義。

  隱式定義記錄

  隱式定義記錄中,我們不用描述記錄的每一個域。這是因為我們不需要定義記錄的結構,不需要使用TYPE語句,相反在聲明記錄變量時使用%ROWTYPE命令定義與數據庫表,視圖,游標有相同結構的記錄,與TYPE命令相同的是它是一種定義獲得數據庫數據記錄的好方法。

DECLARE

accounter_info accounts%ROWTYPR;

CURSOR xactions_cur(acct_no IN VARCHAR2) IS
SELECT action,timestamp,holding
FROM portfoliOS
WHERE account_nbr='acct_no'
;
xaction_info xactions_cur%ROWTYPE;
variable
  有一些PL/SQL指令在使用隱式定義記錄時沒有使用%ROWTYPE屬性,比如游標FOR循環或觸發器中的:old和:new記錄。

DELCARE

CURSOR xaction_cur IS
SELECT action,timeamp,holding
FROM portfoliOS
WHERE account_nbr='37'
;

BEGIN
FOR xaction_rec in xactions_cur
LOOP
IF xactions_rec.holding='ORCL'
THEN
notify_shareholder;
END IF;
END LOOP;

  使用記錄

  用戶可以給記錄賦值、將值傳遞給其他程序。記錄作為一種復合數據結構意味作他有兩個層次可用。用戶可以引用整個記錄,使用select into或fetch轉移所有域,也可以將整個記錄傳遞給一個程序或將所有域的值賦給另一個記錄.
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved