数组

oracle ldboyghg 22℃ 0评论
Oracle数组一般可以分为固定数组和可变数组
固定数组
declare
type v_ar is varray(10) of varchar2(30);
my_ar v_ar:=v_ar(‘g’,’m’,’d’,’龚’,’帅’);
begin
      for i in 1..my_ar.count
      loop
          dbms_output.put_line(my_ar(i));
      end loop;
end;
可变数组
一维数组
declare
type v_table is table of varchar2(30) index by binary_integer;
–类型可以是前面的类型定义,index by binary_integer子句代表以符号整数为索引,
–这样访问表类型变量中的数据方法就是“表变量名(索引符号整数)”。
my_table v_table;
begin
      for i in 1..20
     loop
          my_table(i):=i;
          dbms_output.put_line(my_table(i));
      end loop;
end;
多维数组–多条记录
declare
type v_table is table of liutest%rowtype index by binary_integer;
my_table v_table;
begin
      select * bulk collect into my_table from liutest;
      for i in 1..my_table.count/10 –my_table.count/10取到的值为四舍五入值
      loop
          dbms_output.put_line(‘name–‘||my_table(i).name);
          dbms_output.put_line(‘address—‘||my_table(i).address);
          dbms_output.put_line(‘age—-‘||my_table(i).age);
      end loop;
end;
多维数组–单条记录
declare
type v_table is table of liutest%rowtype index by binary_integer;
my_table v_table;
begin
      select * into my_table(1) from liutest where id=1;
      –my_table(i) i可以为任意整数,但取值时必须保持以i一致;
      dbms_output.put_line(‘–name–‘||my_table(1).name||’–address–‘||my_table(1).address);
end;
自定义数组
create or replace type varray_list as varray(30) of varchar2(50);
–使用自定义数组
create or replace procedure show_list(p_varlist in varray_list)
is
v_str varchar2(50);
begin
      for i in 1..p_varlist.count
      loop
          v_str:=p_varlist(i);
          dbms_output.put_line(‘v_str=’||v_str);
          dbms_output.put_line(‘p_varlist(‘||i||’)=’||p_varlist(i));
     end loop;
end;
declare
my_var varray_list:=varray_list(‘g’,’m’,’d’,’龚’,’帅’);
begin
     show_list(my_var);
end;
Declare
   Type RecType Is Record
   (
  rno empa.empno%type,
    rname empa.ename%type,
    rsal empa.sal%type
   );
   Type TabType Is Table Of RecType Index By Binary_Integer;
   MyTab TabType;
   vN Number;
Begin
   –填充
   vN := 1;
   For varR In (Select * From empa Order By empno ASC)
     loop
    MyTab(vN).rno := varR.empno;
    MyTab(vN).rname := varR.ename;
    MyTab(vN).rsal := varR.sal;
     vN := vN + 1;
    end loop;
   –访问
   vN := MyTab.First;
  — dbms_output.put_line (vN);
  –取得表记录的第一个下标,不一定是1哦,让然在这里确实是1,因为上面是从1开始存的哦
   For x In vN..MyTab.count Loop
    DBMS_OUTPUT.PUT_LINE(x ||’   ‘||MyTab(x).rno||’   ‘||MyTab(x).rname||’   ‘||MyTab(x).rsal);
    –vN := MyTab.Next(vN);–可以换成vn:=vn+1;
    end loop ;
   End ;
Declare
  Type RecType Is Record(
    rno   empa.empno%Type,
    rname empa.ename%Type,
    rsal  empa.sal%Type);
  Type TabType Is Table Of RecType Index By Binary_Integer;
  MyTab TabType;
  vN    empa.empno%Type;
Begin
  –填充
  For varR In (Select empno, ename, sal From empa Order By empno) loop
    MyTab(varR.empno) := varR;
    /*
    注意这一点与上面的填充是不同的哦,上面的表索引时1,2,3。。。。
    知道把所有数据都放进去,这里的表索引是emp表的主键哦,
    这样下面在去这个table中的值时就不可以简简单单的让索引+1了
    ,而是使用next()函数了
    */
  End loop;
  –访问
  vN := MyTab.First;
  For varR In 1 .. MyTab.Count loop
    DBMS_OUTPUT.PUT_LINE(MyTab(vN).rno || ‘   ‘ || MyTab(vN).rname || ‘   ‘ || MyTab(vN).rsal);
    vN := MyTab.Next(vN);
  End loop;
End;

 

转载请注明:生命不息,奋斗不止 » 数组

喜欢 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址