- 一、复合类型---索引表
- 定义格式: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;