1. 程式人生 > 其它 >oracle中的陣列(第一篇)(r4筆記第9天)

oracle中的陣列(第一篇)(r4筆記第9天)

陣列在各種程式語言中都是很重要的資料結構實現,在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; /