實際項目中,經常遇到的三種複合類型變量。結合部分項目實例做個整理,具體如下:
記錄類型:記錄類型可以包含一個或多個成員,而每個成員的類型可以不同,成員可以是標量類型。也可以引用其他的變量類型。這種類型的特點是比較適合處理查詢語句中有多個列的情況,最常用的情況就如在調用某一張表中的一行記錄。
索引表類型(關聯數組):索引表類型和數組相似,他利用鍵值查找對應的值,這裏的鍵值同真正數組的下標不同,索引表中下標允許使用字符串。數組的長度不是固定值,可以根據需要自動增長。其中的鍵值是整數或是字符串,其中的值就是普通的標量類型,也可以是記錄類型。(下標從1開始)
VARRAY 變長數組:變長數組的元素個數需要限制,他是一個存儲有序元素的集合,數組的下標從1開始,適合較少數據時使用。
eg1:記錄類型- declare type pro_x is record (v_id product_info.id%type, v_name varchar2(10), v_price number(8,2)); v_pro pro_x;//聲明變量 v_pro,v_pro的數據類型是pro_x類型。 begin select id,name,price into v_pro from product_info where id='11011211410086'; dbms_output.put_line('id:'||v_pro.v_id||','||'name:'||v_pro.v_name||','||'price:'||v_pro.v_price); end; 記錄類型聲明方式:type type_name is record(field_name datatype[not null]{:=|default}expression) 說明:not null 可以約束記錄成員非空。 可以使用%rowtype進行代替,實現上述功能。即: declare v_pro product_info%rowtype; begin select id,name,price into v_pro from product_info where id='11011211410086'; dbms_output.put_line('id:'||v_pro.id||','||'name:'||v_pro.name||','||'price:'||v_pro.price); end; eg2:索引表類型(關聯數組)---身份證校驗 declare type TiArray is table of integer; type TcArray is table of varchar2(1); type id_emp is table of qlr_info%type index by binary_integer; rst id_emp; W TiArray; A TcArray; S integer; tab varchar2(200); zuihyw varchar2(1); jieguo number; shenfzh varchar2(20); cursor c is select zjbh from qlr_info where length(zjbh)=18 and zjzl='居民身份證' and regexp_like(substr(zjbh,1,17),'^[0-9]*$');//regexp_like(substr(zjbh,1,17),'^[0-9]*$') 表示查找截取的前17爲字符串爲數字。^:匹配開始位置;$:匹配結束位置;*:匹配零次或多次。 begin W:=TiArray(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2); A:=TcArray('1','0','X','9','8','7','6','5','4','3','2'); for emc in c loop S:=0; shenfzh:=emp.zjbh; for i in 1..17 loop S:=S+to_number(substr(shenfzh,i,1)*W(i)); end loop; jieguo:=S mod 11; zuihyw:=A(jieguo+1); zuihyw2:=substr(shenfzh,18,1); if (zuihyw<>zuihyw2) then dbms_output_line('證件編號:'emp.zjbh||'錯誤!') end if; end loop; end; eg2.1使用字符串爲鍵值的索引表 declare type pro is table of number(8) index by varchar2(20); v_pro pro; begin v_pro('test'):=253; v_pro('test1'):=256; dbms_out.put_line(v_pro.first ||','||v_pro(v_pro.first)); end; 索引表類型聲明: type type_name is table of {column_type|variable_name%type|table_name%rowtype}[not null] index by {pls_integer|binary_integer|varchar2(v_size)} eg3,變長數組 declare type varr is varray(10) of varchar2(10);//定義數組長度10 v_pro varr:=varr('1','2');//初始化了兩個元素(最多可以初始化10個) begin v_pro(1):='haha'; v_pro(2):='ouou'; dbms_output.put_line(v_pro(1)||','||v_pro(2)); end; 變長數組聲明:type type_name is {varray|varying array}(size_limit)of element_type[not null] 2016.05.11