oracle 数组定义

集合:是具有相同定义的元素的聚合。Oracle有两种类型的集合:  
   
  可变长数组(VARRAY):可以有任意数量的元素,但必须预先定义限制值。  
   
  嵌套表:视为表中之表,可以有任意数量的元素,不需要预先定义限制值。  
   

  在PL/SQL中是没有数组(Array)概念的。但是如果程序员想用Array的话,就得变通一下,用TYPE   和Table   of   Record来代替多维数组,一样挺好用的。  


  emp_type   就好象一个table   中的一条record   一样,里面有id,   name,gender等。emp_type_array   象个table,   里面含有一条条这样的record   (emp_type),就象多维数组一样。  

 

                               

--单维数组  
  DECLARE  
  TYPE   emp_ssn_array   IS   TABLE   OF   NUMBER  
  INDEX   BY   BINARY_INTEGER;  
   
  best_employees   emp_ssn_array;  
  worst_employees   emp_ssn_array;  
   
  BEGIN  
  best_employees(1)   :=   '123456';  
  best_employees(2)   :=   '888888';  
   
  worst_employees(1)   :=   '222222';  
  worst_employees(2)   :=   '666666';  
   
  FOR   i   IN   1..best_employees.count   LOOP  
  DBMS_OUTPUT.PUT_LINE('i='||   i   || &nb

sp; ',   best_employees=   '   ||best_employees(i)  
  ||   ',   worst_employees=   '   ||worst_employees(i));  
  END   LOOP;  
   
  END;  
   
  --多维数组  
  DECLARE  
   
  TYPE   emp_type   IS   RECORD  
  (   emp_id   employee_table.emp_id%TYPE,  
  emp_name   employee_table.emp_name%TYPE,  
  emp_gender   employee_table.emp_gender%TYPE   );  
   
  TYPE   emp_type_array   IS   TABLE   OF   emp_type   INDEX   BY   BINARY_INTEGER;  
   
  emp_rec_array   emp_type_array;  
  emp_rec   emp_type;  
   
  BEGIN  
  emp_rec.emp_id   :=   300000000;  
  emp_rec.emp_name   :=   'Barbara';  
  emp_rec.emp_gender   :=   'Female';  
   
  emp_rec_array(1)   :=   emp_rec;  
   
  emp_rec.emp_id   :=   300000008;  
  emp_rec.emp_name   :=   'Rick';  
  emp_rec.emp_gender   :=   'Male';  
   
  emp_rec_array(2)   :=   emp_rec;  
   
  FOR   i   IN   1..emp_rec_array.count   LOOP  
  DBMS_OUTPUT.PUT_LINE('i='||i  
  ||',   emp_id   ='||emp_rec_array(i).emp_id  
  ||',   emp_name   ='||emp_rec_array(i).emp_name  
  ||',   emp_gender   =   '||emp_rec_array(i).emp_gender);  
  END   LOOP;    


END;  
  --------------   Result   --------------  
  i=1,   emp_id   =300000000,   emp_name   =Barbara,   emp_gender   =   Female  
  i=2,   emp_id   =300000008,   emp_name   =Rick,   emp_gender   =   Male

 

用下面语句声明数组类型  
  type   intarray   is   varry(30)   of   integer;  
   
  用下面语句声明一个数组变量  
  declare    
      AAA   intarray;

 

一个例子

declare
  stmt varchar2(200);
  dept_no_array dbms_sql.Number_Table;
  c number;
  dummy number;
begin
  dept_no_array(1) := 10; dept_no_array(2) := 20;
  dept_no_array(3) := 30; dept_no_array(4) := 40;
  dept_no_array(5) := 30; dept_no_array(6) := 40;


  stmt := 'delete from emp where deptno = :dept_array';
  c := dbms_sql.open_cursor;
  dbms_sql.parse(c, stmt, dbms_sql.native);
  dbms_sql.bind_array(c, ':dept_array', dept_no_array, 1, 4);
  dummy := dbms_sql.execute(c);
  dbms_sql.close_cursor(c);

  exception when others then
    if dbms_sql.is_open(c) then
      dbms_sql.close_cursor(c);
    end if;
    raise;
end;
/

=============================================

from http://blog.csdn.net/yxc369/archive/2006/12/13/1441567.aspx

 

 

1。如果使用固定长度的数组,而且不需要在外部定义可以如下定义:

create or replace function test() return varchar2 is
  Result varchar2(100);
   type ar is varray(15) of varchar2(12);
   rt ar:=ar('dd','ff','ss');
  i integer:=1;
 
begin
    
     for i in 1..ar.count loop
          rt(i):=i;

     dbms_output.put_line('count='||rt(i));

         end loop;
       return(Result);
end cc;

ar是定义的数组类型

rt是ar的类型的变量,此处注意就是ar必须初始化。如果不初始化后边是不能使用的


2。如果我们要使用的数组长度不能预计,我们可以按如下方法作:

create or replace function test() return varchar2 is
  Result varchar2(100);
  TYPE numtab IS TABLE OF varchar2(50) INDEX BY BINARY_INTEGER; 
     arr numtab;
     i integer:=1;
 
begin
    
     for i in 1..15 loop
     arr(i):=i;
     dbms_output.put_line('arr['||i||']='||arr(i));
     end loop;
     dbms_output.put_line('count='||arr.count);
  return(Result);
end cc;

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值