日期:2014-05-16  浏览次数:20499 次

oracle数据复杂类型(一)
1.
pls_integer   ------这个类型由cpu 来进行计算,可能会存在一些溢出导致错误,但是速度快
binary_integer --- 由Oracle来执行,不会出现溢出,但是执行速度较慢,因为它是由Oracle模拟执行 稳定 ,速慢
PLS_INTEGER和BINARY_INTENER唯一区别是在计算当中发生溢出时,BINARY_INTENER型的变量会被自动指派给一个NUMBER型而不会出错,PLS_INTEGER型的变量将会发生错误。

2.通过%type方式引用某个表中的数据类型
declare
  v_sal emp.sal% type;
  v_ename emp.ename% type;
  begin
    select t.sal into v_sal  from emp t where rownum =1;
    select t.ename into v_ename from emp t where rownum =1;
    dbms_output.put_line( 'v_sal===='||v_sal);
   dbms_output.put_line( 'v_ename===='||v_ename);
end;


3.一次给多个变量赋值
declare
  v_sal emp.sal% type;[list]
[*]
[/list]
  v_ename emp.ename% type;
  begin
    select t.sal , t.ename  into v_sal,v_ename  from emp t where rownum=1 ;
    dbms_output.put_line( 'v_sal===='||v_sal);
   dbms_output.put_line( 'v_ename===='||v_ename);
end;


4.通过%rowtype引用已经存在的表一列的类型
declare
  v_sal emp.sal% type;
  v_ename emp.ename% type;
  v_emp emp%rowtype;  ----引用一列使用rowtype
  begin
    select * into v_emp  from emp t where rownum =1;----这里只可以用*,不可以再指定赋值某些列(1)
    dbms_output.put_line( 'v_emp.ename===='||v_emp.ename);  ---用过变量.列名的方式取值
end;



5通过record来定义一个数据类型集合(可以解决注释(1)中的问题)
declare

    type emp_record is record(   ---- 定义一种类型 类型名称为emp_record 类似c语言中的结构体
         v_ename emp.ename%type,
         v_sal emp.sal%type,
         v_empno emp.empno%type
);
   v_emp_record emp_record;   ----定义一个变量名为v_emp_record ,类型为emp_record的变量
   v_emp_record1 emp_record;
begin

     -----将值付给变量的指定属性
   select t.sal,t.empno,t.ename into  v_emp_record.v_sal, v_emp_record.v_empno , v_emp_record.v_ename from emp t where rownum=1;
   
      -----将值付给变量(顺序按照emp_record中定义属性的顺序)
   select t.ename,t.empno, t.sal  into  v_emp_record1 from emp t where rownum=1;
  
   dbms_output.put_line('v_emp_record.ename===='||v_emp_record.v_ename);
   dbms_output.put_line('v_emp_record1.ename===='||v_emp_record1.v_ename);
end;


二  集合容器(索引表,嵌套表,varray)
  1.索引表  单列多行问题
    declare
            type num_array is table of number(5) index by binary_integer;  ---定义num_array   这种类型;
  v_num_array num_array;  
  begin
  for i in 1..10 loop
         v_num_array(i):=i;
  end loop;
      for k in reverse 1..10 loop
         dbms_output.put_line(' v_num_array('||k||')==='|| v_num_array(k));
  end loop;
end;

2 多列多行问题

declare
          ---emp%rowtype表示集合中元素类型(这里也可以上面的record类型),binary_integer 表示索引下标类型(也可以是varchar2作为下标)
  type emp_array is table of emp% rowtype index by binary_integer ;
  v_emp_array emp_array;
  begin
/*********************************************************************************************************
  *   binary_integer 表示在数据全部取出后一次性放到v_emp_array中,这时其中的多条记录相当于是一个集合了,v_emp_array也是集合类型的,
 *  所以可以正确的赋值,而不加binary_integer表示先取出一跳record就赋给v_emp_array ,两者类型不统一,所以不能赋值
***********************************************************************************************************/
select *  bulk collect   into v_emp_array  from emp t ;

   for i in v_emp_array.first..v_emp_array.last loop
      dbms_output.put_line(v_emp_array(i).ename|| '  '||v_emp_array(i).sal);
   end loop ;
end ;



3.使用varchar2作为下标的例子来罗(个人感觉和java中HashMap很像)
declare
  type name_array is table of varchar2(50) index by varchar2(20) ;
  
  v_name_array name_array;
  
  begin
           v_name_array('zhongguo'):='beijing';    
           v_name_array('meiguo'):='huashengdun';   
           v_name_array('hanguo'):='shouer';    
            dbms_output.put_line(v_name_array('hanguo'));
           
end;

--------------------今天就这些--------------------------------------------