oracle集合型別的first、next、prior、last方法.TXT

to_be_Dba發表於2013-09-05

昨天plsql challenge網站上的每日一題是關於goto語句、continue語句跳轉用法的。選錯了兩個。發現自己對於集合的屬性認識有點混淆,經常出錯。通過以下的實驗記錄一下:

首先建立一個儲存過程,用於產生oracle三種集合型別的資料

create or replace procedure plch_main
is
  TYPE NESTED_T      IS TABLE  OF NUMBER;--巢狀表型別
  TYPE ASSOCIATIVE_T IS TABLE  OF NUMBER  INDEX BY BINARY_INTEGER; --索引表型別
  TYPE VARRAYS_T     IS VARRAY(10) OF NUMBER; --變長陣列型別
 
  lst_nested nested_t:=nested_t(-2000,null,3500);
  lst_associative associative_t;--索引表型別的集合不能直接賦值 可以從其特性來理解(可以是稀疏排列的)
  lst_varrays varrays_t:=varrays_t(-2000,null,3500);
begin

  lst_associative(1):=-2000;
  lst_associative(3):=null;--注意,這裡沒有lst_associative陣列第二個元素
  lst_associative(4):=3500;

  dbms_output.put_line('以下為巢狀表的輸出內容:');
  dbms_output.put_line('lst_nested(1)     :'||lst_nested(1));
  dbms_output.put_line('lst_nested(2)     :'||lst_nested(2));
  dbms_output.put_line('lst_nested(3)     :'||lst_nested(3));
  dbms_output.put('lst_nested.first-1:'); 
  dbms_output.put_line(lst_nested.first-1);
  dbms_output.put_line('lst_nested.first  :'||lst_nested.first);
  dbms_output.put_line('lst_nested.prior(1):'||lst_nested.prior(1));
  dbms_output.put_line('lst_nested.next(1):'||lst_nested.next(1));
  dbms_output.put_line('lst_nested.next(2):'||lst_nested.next(2));
  dbms_output.put_line('lst_nested.next(3):'||lst_nested.next(3));
  dbms_output.put_line('lst_nested.last   :'||lst_nested.last);
 
  dbms_output.put_line('以下為索引表的輸出內容:'); 
  dbms_output.put_line('lst_associative(1)     :'||lst_associative(1));
  dbms_output.put_line('lst_associative(3)     :'||lst_associative(3));
  dbms_output.put_line('lst_associative(4)     :'||lst_associative(4));
  dbms_output.put('lst_associative.first-1:');
  dbms_output.put_line(lst_associative.first-1);
  dbms_output.put_line('lst_associative.first  :'||lst_associative.first);
  dbms_output.put_line('lst_associative.prior(1):'||lst_associative.prior(1));
  dbms_output.put_line('lst_associative.next(1):'||lst_associative.next(1));
  dbms_output.put_line('lst_associative.next(2):'||lst_associative.next(2));
  dbms_output.put_line('lst_associative.next(4):'||lst_associative.next(4));
  dbms_output.put_line('lst_associative.last   :'||lst_associative.last);
 
  dbms_output.put_line('以下為變長陣列的輸出內容:');
  dbms_output.put_line('lst_varrays(1)     :'||lst_varrays(1));
  dbms_output.put_line('lst_varrays(2)     :'||lst_varrays(2));
  dbms_output.put_line('lst_varrays(3)     :'||lst_varrays(3));
  dbms_output.put('lst_varrays.first-1:');
  dbms_output.put_line(lst_varrays.first-1);
  dbms_output.put_line('lst_varrays.first  :'||lst_varrays.first);
  dbms_output.put_line('lst_varrays.prior(1):'||lst_varrays.prior(1));
  dbms_output.put_line('lst_varrays.next(1):'||lst_varrays.next(1));
  dbms_output.put_line('lst_varrays.next(2):'||lst_varrays.next(2));
  dbms_output.put_line('lst_varrays.next(3):'||lst_varrays.next(3));
  dbms_output.put_line('lst_varrays.last   :'||lst_varrays.last);
end;
/

儲存過程編譯成功,以下呼叫並檢視結果。
特別注意三種陣列中第一個元素的prior方法、最後一個元素的next方法都是可以執行出來的;
並且索引表型別中未定義的元素序列也有prior、next方法。

SQL> exec plch_main;

以下為巢狀表的輸出內容:
lst_nested(1)     :-2000
lst_nested(2)     :
lst_nested(3)     :3500
lst_nested.first-1:0
lst_nested.first  :1
lst_nested.prior(1):
lst_nested.next(1):2
lst_nested.next(2):3
lst_nested.next(3):
lst_nested.last   :3
以下為索引表的輸出內容:
lst_associative(1)     :-2000
lst_associative(3)     :
lst_associative(4)     :3500
lst_associative.first-1:0
lst_associative.first  :1
lst_associative.prior(1):
lst_associative.next(1):3
lst_associative.next(2):3
lst_associative.next(4):
lst_associative.last   :4
以下為變長陣列的輸出內容:
lst_varrays(1)     :-2000
lst_varrays(2)     :
lst_varrays(3)     :3500
lst_varrays.first-1:0
lst_varrays.first  :1
lst_varrays.prior(1):
lst_varrays.next(1):2
lst_varrays.next(2):3
lst_varrays.next(3):
lst_varrays.last   :3

PL/SQL procedure successfully completed

.first方法是陣列中第一個元素的下標值(序列值)
.prior(n)方法是陣列中第n個元素的前一個元素的下標值(序列值)
這個是容易搞錯的。

 

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

相關文章