oracle中的陣列(第一篇)

dbhelper發表於2015-01-17
陣列在各種程式語言中都是很重要的資料結構實現,在oracle中也有自己的一席之地。自己簡單做了幾個實驗,發現很多東西還是眼高手低,真實去做的時候,裡面還是有不少的細節的。
首先陣列大體可以有以下幾種。
固定長度的陣列
變長陣列
多維陣列
如果說實現方式,就有varray,巢狀表,record等等。我們從varray來開始。
比如實現一個固定長度的陣列。長度為10

SQL> create type varray_type as varray(10) of number(10);
  2  /
Type created.
如果觀察足夠仔細,就會發現,建立type已經以;結尾了,但是還是需要等到/出現才會建立type.
我們來一個等價的方式。
SQL> drop type varray_type;
Type dropped.

SQL> create type varray_type is varray(10) of number(10)
  2  /
Type created.

我們可以改變陣列的資料型別,但是也是以擴充套件為前提。比如我們收縮資料型別。
SQL> alter type varray_type modify element type number(9);
alter type varray_type modify element type number(9)
*
ERROR at line 1:
ORA-22324: altered type has compilation errors
ORA-22328: object "N1"."VARRAY_TYPE" has errors.
PLS-00729: only widening of the collection element type is allowed
ORA-06550: line 0, column 0:
PL/SQL: Compilation unit analysis terminated

但是如果擴充套件,就沒有問題。
SQL> alter type varray_type modify element type number(11) cascade;
Type altered.
我們也可以修改資料的長度。
alter type varray_type modify limit 200 cascade;

如果需要對varray初始化,語法和cursor還是很相似的。
比如我們直接呼叫剛建立的varray,初始化資料,然後輸出。
set serveroutput on
declare
v_type varray_type;
begin
v_type:=varray_type(5,2,4);
for i in v_type.first()..v_type.last() loop
dbms_output.put_line(v_type.limit);
dbms_output.put_line(v_type(i));
dbms_output.put_line(v_type.count());
end loop;
end;
/

其中for i in v_type.first()..v_type.last() loop  等價於 for i in 1..v_type.count() loop
輸出的結果如下:
10
5
10
2
10
4

固定長度的陣列相對比較簡單,來看看不定長的陣列,可以使用下面的形式來實現。
如果格式和定長陣列類似,可以這樣寫。
DECLARE
  TYPE new_type IS TABLE OF VARCHAR2(10) ;
  v_tab new_type:=new_type('a','b','c');
  BEGIN
      
  FOR i IN 1..v_tab.count LOOP
  dbms_output.put_line(v_tab(i));
  END LOOP;
  END;
  /
輸出為:
a
b
c

一般比較靈活的方式是使用index by的方式。
DECLARE
  TYPE new_type IS TABLE OF VARCHAR2(10) INDEX BY BINARY_INTEGER;
  v_tab new_type ;
  BEGIN
      v_tab(1):='a';
      v_tab(2):='b';
      v_tab(3):='c';
  FOR i IN 1..v_tab.count LOOP
  dbms_output.put_line(v_tab(i));
  END LOOP;
  END;
  /
輸出結果如下:
a
b
c

如果你沒有index by 的部分,那麼就會丟擲下面的錯誤,這個時候需要使用v_tab.extend來一行一行的挪動了。
SQL> DECLARE
  2    TYPE new_type IS TABLE OF VARCHAR2(10) ;
  3    v_tab type_tab;
  4    BEGIN
  5        v_tab(1):='a';
  6        v_tab(2):='b';
  7        v_tab(3):='c';
  8    FOR i IN 1..v_tab.count LOOP
  9    dbms_output.put_line(v_tab(i));
 10    END LOOP;
 11    END;
 12    /
DECLARE
*
ERROR at line 1:
ORA-06531: Reference to uninitialized collection
ORA-06512: at line 5

需要新增啊extend的字句,一行一行的挪。
DECLARE
  TYPE new_type IS TABLE OF VARCHAR2(10) ;
  v_tab new_type:=new_type();
  BEGIN
      v_tab.extend;
      v_tab(1):='a';
      v_tab.extend;
      v_tab(2):='b';
      v_tab.extend;
      v_tab(3):='c';
  FOR i IN 1..v_tab.count LOOP
  dbms_output.put_line(v_tab(i));
  END LOOP;
  END;
  /






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

相關文章