oracle 三種複合類型變量分析

實際項目中,經常遇到的三種複合類型變量。結合部分項目實例做個整理,具體如下:

  1. 記錄類型:記錄類型可以包含一個或多個成員,而每個成員的類型可以不同,成員可以是標量類型。也可以引用其他的變量類型。這種類型的特點是比較適合處理查詢語句中有多個列的情況,最常用的情況就如在調用某一張表中的一行記錄。

  2. 索引表類型(關聯數組):索引表類型和數組相似,他利用鍵值查找對應的值,這裏的鍵值同真正數組的下標不同,索引表中下標允許使用字符串。數組的長度不是固定值,可以根據需要自動增長。其中的鍵值是整數或是字符串,其中的值就是普通的標量類型,也可以是記錄類型。(下標從1開始)

  3. 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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章