?
標(biāo)量數(shù)據(jù)類型
?
|
Number
系列及其子類型
Char
系列及其子類型
Date
等比列及其子類型
Interval
系列
(oracle 9i
特有
)
Timestamp
系列
(oracle 9i
特有
)
MSLABEL
系列
|
復(fù)合數(shù)據(jù)類型
|
記錄類型
(record)
、
Index-By
表
嵌套表、
Varray
|
對象數(shù)據(jù)類型
|
Object
類型、
OBLECT REF
、
LOB
類型、
Sys.AnyType
、
SYS.ADYDATA
和
SYS.ANYDATASET(oracle 9i
特有
)
|
其它
pl/sql
特有的數(shù)據(jù)類型
|
BOOLEAN
、
BINARY_INTEGER
、
PLS_INTEGER
、
%TYPE
、
REF CURSOR
SYS_REFCURSOR(oracle 9i
特有
)
用戶定義子類型
|
記錄
??????
在
pl/sql
中可以定義三種類型的記錄
:
顯式定義的記錄,面向數(shù)據(jù)庫表的記錄,面向游標(biāo)的記錄。
?
記錄的定義其語法如下:
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
不會占用任何資源,直到專名該類型的變量時(shí)才占用資源
?
記錄類型的使用
?
記錄類型的變量定義以后,接下來就是使用記錄來處理數(shù)據(jù)。
? 1
、訪問記錄中的遠(yuǎn)素
? 2
、測試記錄是否相等
?????
記錄比較應(yīng)比較完記錄的每個(gè)字段
,
看它們是否相等,把記錄看作整體來比較的做的作法是錯(cuò)誤的。
記錄的使用就像一個(gè)對象。可以對它進(jìn)行賦值,
oracle 9i
中有幾種賦值方法:
1)???
對各個(gè)字段賦值
2)???
使用
select into
語句填充一個(gè)記錄
3)???
使用
fetch into
語句填充一個(gè)記錄
4)???
使用一個(gè)記錄為另一個(gè)記錄賦值(聚集賦值)
?
其它記類型
1????????
面向表的記錄類型
?
定義
:
?? Record_var_name? table_name%rowtype;
?????????????
?
使用:
????????? Select * into record_var_name from hrc_tab where id=?
2????????
面向游標(biāo)的記錄類型
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;
涉及整個(gè)
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=’99’
?
Index-by
表
? Index-by
表是一同一個(gè)與數(shù)組類似的同質(zhì)元素的集合組成的一種復(fù)合數(shù)據(jù)類型。集合中的元素稀
?
分布且沒有限定邊界,只是由一個(gè)整數(shù)索引將其連接在一起。
?
定義
Index-by
表的型
?? Type table_name_type is table of type [not null] index by binary_integer
下面是一個(gè)聲明這種類型的示例
? Type num_tab is table of number index by binary_integer
聲明表類型的變量
? V_num_tab num_tab;
Index-by
表的使用
index-by
表是兩列的(一列索引,另一列是對應(yīng)的值)結(jié)構(gòu),
index-by
是
pl/sql
特有,所以在
sql
中它們自然就不可用,另外,也不能存儲在數(shù)據(jù)庫中,這樣導(dǎo)致不能在
index-by
表中使用
select ,insert ,update
和
delete
等
SQL? DML
操作。對
index-by
表來說沒有
commit
或
rollback
,一個(gè)例子:
?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
相兼容的文字,變量或表達(dá)式作為
index-by
表的索引
?
可樣也可以把一個(gè)
index-by
表賦值給另一個(gè)
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
表中只有在賦值時(shí)才可以創(chuàng)建行,因些在賦值以前,行是一存在的,這是因?yàn)?/span>
index-by
表沒有上下界,訪問沒定義的行會出現(xiàn)
N)_DATA_FOUND
行。
?
Index-by
表的填充有三種方法:
?1
通過賦值創(chuàng)建元素行,
?2
使用
loop
為
index-by
表的行賦值
?3
用一個(gè)
index-by
表為另一個(gè)
index-by
表賦值
第一種方法前面用了,第二種方法就是一個(gè)循環(huán)了,如
:
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
表,然后用該表執(zhí)行聚集賦值
2、?
使用
index-by
表的
delete
方法。
Index-by
表的方法:
?
方法
|
用途
|
語法
|
Exits
|
檢查某個(gè)元素是否存在,如果存在,返回值是
true
,反之面,返回
false
|
Table_name.exists(index)
|
Count
|
返加已確定的元素個(gè)數(shù)
|
Table_name.count
|
Delete
|
刪除一部墜毀(也包括沒定義的)或全部元素,如刪除開始索引與結(jié)束索引之間的表元素
|
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? //
用這種方法必須要確定行是連續(xù)填充的,下界是一個(gè)
//
定的值。
?????? Dbms_output.put_line(to_char(v_example_tab(idx)));
End loop;
?
V_example_tab.delete(1)
;
//
刪除第一個(gè)索引的記錄
V_example_tab.delete(2,5);//
刪除第
2
至第
5
個(gè)索引記錄
V_example_tab.delete;//
刪除所有記錄
?
使用
first,last,next
方法的例子
Idx:=v_example_tab.first;
Loop
?????? Dbms_output.put_line();
Exit when? idx:=v_example_tab.last;
Idx:=v_example_tab.next();
End loop;
?
這樣遍歷一個(gè)
index-by
表是最好的,表的記錄可以不連續(xù)。
?
記錄的
Index-by
表
?
定義
index-by
表的幾個(gè)步驟
?
1、?
定義記錄類型
2、?
定義記錄類型的表類型
3、?
定義表類型的變量
?
一個(gè)例子:
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;
?
聯(lián)合數(shù)組
?
在
oracle 9i release 2
中,可以使用
varchar2
類型的索引代規(guī)
binary_integer
類型的索引來定義
index-by
表,用
varchar2
索引作為數(shù)據(jù)庫表的關(guān)鍵字,可以提高數(shù)據(jù)庫的性能。
例子:
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;
?
?
?
posted on 2006-09-15 14:20
有貓相伴的日子 閱讀(1274)
評論(0) 編輯 收藏 所屬分類:
pl/sql