博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

复合类型

Posted on 2008-11-09 16:57  徐正柱-  阅读(323)  评论(0编辑  收藏  举报
一、复合类型---索引表
定义格式:TYPE<表类型名>IS TABLE OF <数据类型> INDEX BY BINARY_INTEGER;
声明表变量:<表变量名> <表类型名>;
引用:<表变量名>(<索引变量>);
如:1. TYPE dept_table_type             IS TABLE OF   dept%ROWTYPE      INDEX BY BINARY_INTEGER;  
    2. TYPE table_col                        IS TABLE OF    VARCHAR2(4)        INDEX BY BINARY_INTEGER;
    3. TYPE type_table_emp_empno   IS TABLE OF    EMP.EMPNO%TYPE  INDEX BY BINARY INTEGER;  
        --TABLE                                  变量类型 表示数组
        --INDEX BY BINARY INTEGER表示数组下标由整数表示

    declare
              type type_table_emp_empno is table of emp.empno%type index by binary integer;
              --index by binary integer表示数组下标由整数表示

              v_empnos  type_table_emp_empno;--定义一个变量是type_table_emp_empno类型

    begin
              v_empnos(0):=6666;--这里的0表示下标
              v_empnos(-1):=7777;--oracle允许小标为负数
              dbms_output.put_line(v_empnos(-1));
    end;

二、复合类型---记录

定义格式:type <记录类型名> is record (成员变量 成员变量类型)

TYPE type_record_dept IS RECORD
(deptno dept.deptno%type,
 dname  dcpt.dname%type,
 ioc        dept.ioc%type
);
v_temp type_record_dcpt;

例子:

     declare
                type type_record_dept is record
                                                    ( deptno dept.deptno%type,
                                                      dname dcpt.dname%type,
                                                      ioc dept.ioc%type
                                                    );
                 v_temp type_record_dcpt;
     begin
                 v_temp.deptno:=-50;
                 v_temp.dname:='dddd';
                 v_temp.ioc:='hj';
                 dbms_output.put_line(v_temp.dcptno||''||v_temp.dname);
     end;

     此时如果dept表增加或删除字段 维护起来麻烦可以使用
     --  %rowtype申明record变量  取得一行数据这张表的行有多少列怎么分他就怎么分
     declare
               v_temp dept%rowtype;
     begin
               v_temp.deptno:=-50;
               v_temp.dname:='aaa';
               v_temp.ioc:='hj';
               dbms_output.put_line(v_temp.dcptno||''||v_temp.dname);

     end;

三、    BULK COLLECT 关键字的引用
BULK COLLECT是一个PL/SQL语句,而不是SQL语言的一部分。因此,如果想用SQL执行一个BULK COLLECT操作,我必须在一个PL/SQL块内进行操作。例如:
DECLARE
              TYPE UsrId_Array             IS TABLE OF NUMBER;
              TYPE MphoneCode_Array  IS TABLE OF NUMBER;
              vusrid UsrId_Array;
              vmphonecode MphoneCode_Array;
   
              type test_type is table of tf_f_usrarch_main%rowtype;
   
              CURSOR cur_tf_f_usrarch_main   IS
                                                               select usrid, mphonecode from tf_f_usrarch_main where rownum<10;
              CURSOR cur_tf_f_usrarch_main1 IS
                                                               select * from tf_f_usrarch_main where rownum<10;
    
              temp NUMBER;
              temp1 test_type := test_type();  ----初始化变量
BEGIN
         OPEN  cur_tf_f_usrarch_main;
         FETCH cur_tf_f_usrarch_main BULK COLLECT INTO vusrid, vmphonecode;
                  dbms_output.put_line(to_char(vusrid.count));
         FOR temp IN 1..vusrid.count
         LOOP
                  dbms_output.put_line(vusrid(temp));
         END LOOP;
END;