複合資料型別--此處偶做了index_by表的試驗#zhuan#

fengzj發表於2009-03-21

 複合資料型別
--------------------------------------------------
-----此處偶做了index_by表的試驗:
測試1
   declare
          type t_product_id is table of number index by binary_integer;
          type t_serial_no is table of varchar(300) index by binary_integer;
          type t_buy_date is table of date index by binary_integer;

          gzff_id    t_product_id;
          dw_name    t_serial_no;
          year_month t_buy_date;
          ----------------------------
          cursor cur_sfc_tbl_product_reg is
            select a.GZFF_ID GZFF_ID, a.DW_NAME DW_NAME, a.YEAR_MONTH YEAR_MONTH
              from RM.HRM_COMP_GZFF a;

          i number default 1;

        begin
          for onrecord in cur_sfc_tbl_product_reg loop
            GZFF_ID(i) := onrecord.GZFF_ID;
            DW_NAME(i) := onrecord.DW_NAME;
            YEAR_MONTH(i) := onrecord.YEAR_MONTH;
            dbms_output.put_line(to_char(GZFF_ID(i)) || DW_NAME(i) ||
                         to_char(YEAR_MONTH(i)));
            i := i + 1;
          end loop;
        end;
--------------------------------------------------
測試2
        declare
        type ltype_id is table of number(38) index by binary_integer;
        ll_id ltype_id;
        cursor cur_qcs_cor_ntf_new is
        select * from qm.qcs_cor_ntf_new ;
        i number :=1;
        begin

        for on_record in cur_qcs_cor_ntf_new
        loop
        ll_id(i) := on_record.id;
        dbms_output.put_line('第'||i||' 個,值為: '||ll_id(i));
        i:=i+1;
        end loop;
        end ;
------------------------------------------------------

--上面為自己做的例子,下面為參考說明

------------------------------------------------------
集合的型別
  PL/SQL有三種型別的集合
  . Index_by表
  . 巢狀表
  . VARRAY
   這三種型別的集合之間由許多差異,包括資料繫結、稀疏性(sparsity)、資料庫中的儲存能力都不相同。繫結涉及到集合中元素數量的限制, VARRAY集合中的元素的數量是有限,Index_by和巢狀表則是沒有限制的。稀疏性描述了集合的下標是否有間隔,Index_by表總是稀疏的,如 果元素被刪除了巢狀表可以是稀疏的,但VARRAY型別的集合則是緊密的,它的下標之間沒有間隔。
  Index_by表不能儲存在資料庫中,但巢狀表和VARRAY可以被儲存在資料庫中。
  雖然這三種型別的集合有很多不同之處,但他們也由很多相似的地方:
   . 都是一維的類似陣列的結構
   . 都有內建的方法
   . 訪問由點分隔
  Index_by表
  Index_by表集合的定義語法如下:
TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX
BY BINARY_INTERGET;
   這裡面重要的關鍵字是INDEX BY BINARY_INTERGET,沒有這個關鍵字,那麼集合將是一個巢狀表,element_type可以是任何合法的PL/SQL資料型別,包括: PLS/INTEGER、SIGNTYPE、和BOOLEAN。其他的集合型別對資料庫的資料型別都有限制,但Index_by表不能儲存在資料庫中,所 以沒有這些限制。
  一旦定義了index_by表,就可以向建立其他變數那樣建立index_by表的變數:
DECLARE
TYPE symbol_tab_typ IS TABLE OF VARCHAR2(5) INDEX BY BINARY_INTEGER;
symbol_tab symbol_tab_typ;
BEGIN
  巢狀表
  巢狀表非常類似於Index_by表,建立的語法也非常相似。使用TYPE語句,只是沒有INDEX BY BINARY_INTEGER子串。
  TYPE type_name IS TABLE OF element_type [NOT NULL]
  NOT NULL選項要求集合所有的元素都要有值,element_type可以是一個記錄,但是這個記錄只能使用標量資料型別欄位以及只用於資料庫的資料型別(不能是PLS_INTEGER,BOOLEAN或SIGNTYPE)。
   巢狀表和VARRAY都能作為列儲存在資料庫表中,所以集合自身而不是單個的元素可以為NULL,ORACLE稱這種整個集合為NULL的為"自動設定 為NULL(atomically NULL)"以區別元素為NULL的情況。當集合為NULL時,即使不會產生異常,使用者也不能引用集合中的元素。使用者可以使用IS NULL操作符檢測集合是否為NULL。
  儲存在一個資料庫中的巢狀表並不與表中的其它資料存放在同一個資料塊中,它們實際上被存放在第二個表 中。正如沒有order by子句select語句不能保證返回任何有順序的資料,從資料庫中取回的巢狀表也不保證元素的順序。由於集合資料是離線儲存的,對於大型集合巢狀表是一 個不錯的選擇。
  VARRAY
  VARRAY或資料變數都有元素的限制。想起他集合一樣VARRAY定義仍然使用TYPE語句,但關鍵字VARRAY或VARRYING ARRAY告訴ORACLE這是一個VARRAY集合。
TYPE type_name IS [VARRAY|VARYING ARRAY] (max_size) OF
element_type [NOT NULL]
   max_size是一個整數,用於標示VARRAY集合擁有的最多元素數目。VARRAY集合的元素數量可以低於max_size,但不能超過 max_size。element_type是一維元素的資料型別,如果element_type是記錄,那麼這個記錄只能使用標量資料欄位(與巢狀標相 似)。NOT NULL子串表示集合中的每一個元素都必須有值。
  與巢狀表相似,VARRAY能夠自動為NULL,可以使用IS NULL操作符進行檢測。與巢狀表不同的是,當VARRAY儲存在資料庫中時與表中的其他資料存放在同一個資料塊中。正象列的排序儲存在表的 SELECT*中一樣元素的順序儲存在VARRAY中。同樣由於集合是線上儲存的,VARRAY很適合於小型集合。

-------------------------------------------------------------------------
 關於集合之間的比較

  集合不能直接用於比較,要比較兩個集合,可以設計一個函式,該函式返回一個標量資料型別。

IF stock_list1>stock_list2 ----非法
IF sort_collection(stock_list1)>sort_collection(stock_list2) THEN --合法
但可以比較在集合內的兩個元素。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/219982/viewspace-573306/,如需轉載,請註明出處,否則將追究法律責任。

相關文章