標量數據類型
|
Number 系列及其子類型 Char 系列及其子類型 Date 等比列及其子類型 Interval 系列 (oracle 9i 特有 ) Timestamp 系列 (oracle 9i 特有 ) MSLABEL 系列 |
復合數據類型 |
記錄類型 (record) 、 Index-By 表 嵌套表、 Varray |
對象數據類型 |
Object 類型、 OBLECT REF 、 LOB 類型、 Sys.AnyType 、 SYS.ADYDATA 和 SYS.ANYDATASET(oracle 9i 特有 ) |
其它 pl/sql 特有的數據類型 |
BOOLEAN 、 BINARY_INTEGER 、 PLS_INTEGER 、 %TYPE 、 REF CURSOR SYS_REFCURSOR(oracle 9i 特有 ) 用戶定義子類型 |
記錄
?????? 在 pl/sql 中可以定義三種類型的記錄 : 顯式定義的記錄,面向數據庫表的記錄,面向游標的記錄。
記錄的定義其語法如下:
Type record_type_name is record(
?????? Field_name1 datatype not null default
)
例子:
Type person_rec? is record (
?????? Name varchar2(100);
??? Address varchar2(200);
);
記錄類型變量的聲名
? vperson person_rec;
type …record 只是一種操象的定義,因此,它不能由它自己使用, type.. record 不會占用任何資源,直到專名該類型的變量時才占用資源
記錄類型的使用
? 記錄類型的變量定義以后,接下來就是使用記錄來處理數據。
? 1 、訪問記錄中的遠素
? 2 、測試記錄是否相等
????? 記錄比較應比較完記錄的每個字段 , 看它們是否相等,把記錄看作整體來比較的做的作法是錯誤的。
記錄的使用就像一個對象。可以對它進行賦值, oracle 9i 中有幾種賦值方法:
1)??? 對各個字段賦值
2)??? 使用 select into 語句填充一個記錄
3)??? 使用 fetch into 語句填充一個記錄
4)??? 使用一個記錄為另一個記錄賦值(聚集賦值)
其它記類型
1???????? 面向表的記錄類型
? 定義 :
?? Record_var_name? table_name%rowtype;
????????????? ? 使用:
????????? Select * into record_var_name from hrc_tab where id=?
2???????? 面向游標的記錄類型
Declare
?? Cursor csr_hrc is select * from hrc_tab order by 1;
?? hrc_rec csr_hrc%rowtype;
begin
?? …….loop
????????????? Fetch csr_hrc into hrc_rec
??????? Exit when csr_hrc%not found
…..
?? End loop;
end;
涉及整個 pl/sql 記錄的 DML 操作(特指 insert ,update 和 select )
?Insert into hrc_tab values record_var_name
?Update ?hrc_tab set ROW=record_var_name where hrc_code=’
Index-by
表
? Index-by 表是一同一個與數組類似的同質元素的集合組成的一種復合數據類型。集合中的元素稀 ? 分布且沒有限定邊界,只是由一個整數索引將其連接在一起。
定義 Index-by 表的型
?? Type table_name_type is table of type [not null] index by binary_integer
下面是一個聲明這種類型的示例
? Type num_tab is table of number index by binary_integer
聲明表類型的變量
? V_num_tab num_tab;
Index-by
表的使用
index-by 表是兩列的(一列索引,另一列是對應的值)結構,
index-by 是 pl/sql 特有,所以在 sql 中它們自然就不可用,另外,也不能存儲在數據庫中,這樣導致不能在 index-by 表中使用 select ,insert ,update 和 delete 等 SQL? DML 操作。對 index-by 表來說沒有 commit 或 rollback ,一個例子:
?declare
??? type num_tab is table of number index by binary_integer;
??? v_example_tab num_tab;
? v_num number:=13;
begin
?????? v_example_tab(1):=1001;
??? v_example_tab (0):=1002;
??? v_example_Tab(-10):=1003
??? v_example_tab(v_num):=1004p;
??? dbms_output.put_line(to_char(v_example_tab(-10))|| …..)
end;
可以使用任何與 binary_integer 相兼容的文字,變量或表達式作為 index-by 表的索引
可樣也可以把一個 index-by 表賦值給另一個 index-by 表。
?declare
?? type num_tab is table of number index by binary_integer;
?? v_example_tab1? num_tab;
v_example_tab2 num_tab;
?begin
?????? v_example_tab1:= v_example_tab2;
end;
在 index-by 表中只有在賦值時才可以創建行,因些在賦值以前,行是一存在的,這是因為 index-by 表沒有上下界,訪問沒定義的行會出現 N)_DATA_FOUND 行。
Index-by 表的填充有三種方法:
?1 通過賦值創建元素行,
?2 使用 loop 為 index-by 表的行賦值
?3 用一個 index-by 表為另一個 index-by 表賦值
第一種方法前面用了,第二種方法就是一個循環了,如 :
Declare
?? Type num_tab is table of number index by binary_integer;
?? V_Example_tab num_tab;
Begin
?????? For idx in 1..10 loop
?????? V_example_tab(idx) :=(2*idx)+1
??? End loop;
End;
刪除 Index-by 表
?????? 有兩種方法:
1、? 定義一下與已填充的 index-by 表類型相同的空的 index-by 表,然后用該表執行聚集賦值
2、? 使用 index-by 表的 delete 方法。
Index-by 表的方法:
方法
|
用途
|
語法
|
Exits |
檢查某個元素是否存在,如果存在,返回值是 true ,反之面,返回 false |
Table_name.exists(index) |
Count |
返加已確定的元素個數 |
Table_name.count |
Delete |
刪除一部墜毀(也包括沒定義的)或全部元素,如刪除開始索引與結束索引之間的表元素 |
Table_name.delete 刪全部 Table_name.delete(index) 刪除指定索引的 |
fIrst |
返回 index-by 表中第一行的索引值,如果不存在就返回 null |
Table_name.first |
Last |
返回 index-by 表中最后一行的,不存在返回 null |
Table_name.last |
Next |
返回 index-by 表中由特定索引指定的下一行的索引,不存在返回 null |
Table_name.next
|
Prior |
返回 index-by 表中由特定索引指定的前一行索引,如果不存在返回 null |
Table_name.prior |
方法使用例子:
If? v_example.exists(100)? then
?????? dbms_output.put_line(to_char(v_example.exists(100)));
End if ;
For udx? in 1..v_example.count loop? // 用這種方法必須要確定行是連續填充的,下界是一個 // 定的值。
?????? Dbms_output.put_line(to_char(v_example_tab(idx)));
End loop;
V_example_tab.delete(1) ; // 刪除第一個索引的記錄
V_example_tab.delete(2,5);// 刪除第 2 至第 5 個索引記錄
V_example_tab.delete;// 刪除所有記錄
使用 first,last,next 方法的例子
Idx:=v_example_tab.first;
?????? Dbms_output.put_line();
Exit when? idx:=v_example_tab.last;
Idx:=v_example_tab.next();
End loop;
這樣遍歷一個 index-by 表是最好的,表的記錄可以不連續。
記錄的
Index-by
表
定義 index-by 表的幾個步驟
1、? 定義記錄類型
2、? 定義記錄類型的表類型
3、? 定義表類型的變量
一個例子:
Declare
?Type hrc_org_Rdc is record(
????????????? Hrc_org_id? number,
??????? Hrc_descr var_char2(200)
? )
Type hrc_org_tab is table of hrc_org_rec index by binary_integer;
Begin
?? Null;
End;
聯合數組
在 oracle 9i release 2 中,可以使用 varchar2 類型的索引代規 binary_integer 類型的索引來定義 index-by 表,用 varchar2 索引作為數據庫表的關鍵字,可以提高數據庫的性能。
例子:
Declare
? Type site_ary is table of number index by varchar2(20);
? V_example_array site_ary;
Begin
?????? V_example_array(‘xx’):=10;
??? V_example_array(‘yy’):=200;
End;