oracle中的陣列(第一篇)
陣列在各種程式語言中都是很重要的資料結構實現,在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;
其中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;
/
首先陣列大體可以有以下幾種。
固定長度的陣列
變長陣列
多維陣列
如果說實現方式,就有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;
/
比如我們直接呼叫剛建立的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
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle儲存過程中的陣列Oracle儲存過程陣列
- Oracle中陣列使用方法Oracle陣列
- ORACLE 陣列在過程中的應用Oracle陣列
- Oracle陣列的使用Oracle陣列
- Ruby中的陣列陣列
- Go中的陣列Go陣列
- Java中的陣列Java陣列
- [轉]Oracle陣列的使用Oracle陣列
- JavaScript中對陣列和陣列API的認識JavaScript陣列API
- c++中的陣列C++陣列
- 陣列中的逆序對陣列
- PowerShell中的陣列使用陣列
- [譯]Perl中的陣列陣列
- 陣列中每個陣列元素出現的次數陣列
- bash指令碼中的普通陣列和關聯陣列指令碼陣列
- JS 中特殊的物件-陣列JS物件陣列
- 去除陣列中的 null 值陣列Null
- MySQL中陣列的儲存MySql陣列
- Javascript中的陣列物件排序JavaScript陣列物件排序
- Java 中的陣列 如何使用Java陣列
- Ruby 中陣列的常用操作陣列
- OC中的陣列、字典、集合陣列
- javascript中陣列的回顧JavaScript陣列
- JavaScript中對陣列的操作JavaScript陣列
- 【陣列】1394. 找出陣列中的幸運數(簡單)陣列
- JS中陣列操作JS陣列
- oracle INDEX BY Pl/sql陣列OracleIndexSQL陣列
- Oracle之可變陣列Oracle陣列
- js如何獲取指定陣列元素在陣列中的索引值JS陣列索引
- 如何將一個陣列中的元素插入另一個陣列陣列
- js將一個陣列追加到原陣列中JS陣列
- iOS遍歷陣列相同值元素到另一陣列中同一物件的子陣列iOS陣列物件
- 二維陣列中的查詢陣列
- php去除陣列中的鍵名PHP陣列
- 第81節:Java中的陣列Java陣列
- 陣列中重複的數字陣列
- 旋轉陣列中的最小元素陣列
- 陣列中&a與&a[0]的區別陣列