记录表(或索引表)数据类型与记录类型相似,是对记录类型的扩展。因为记录类型只能处理单条数据,所以扩展表类型处理
多条记录,类似于二维数组,可以模仿数据库中的表。
记录表类型的定义语法:
--记录表类型的定义语法 TYPE table_name IS TABLE OF element_type [not null] INDEX BY [BINARY_INTEGER | PLS_INTEGER | VARRAY2]; --关键字 INDEX BY 表示创建一个主键索引,以便引用记录表变量中的特定行。创建表,和插入数据:
create table mytest( id number(3), name varchar2(20), age number(3) ); insert into mytest values(1,'one',18); insert into mytest values(2,'two',20); insert into mytest values(3,'three',24); commit;
实例使用:
DECLARE --定义记录表类型 TYPE mytest_table_type IS TABLE OF mytest%ROWTYPE INDEX BY BINARY_INTEGER; --声明记录类型 v_table_type mytest_table_type; --定义循环变量 v_count number(2) := 3; BEGIN --每次根据id查询的数据放在记录表中,同时int指定特定下标,像表的主键 FOR int IN 1..v_count LOOP SELECT * INTO v_table_type(int) FROM mytest WHERE id = int; END LOOP; --从记录表中循环输出数据,每次根据id查询出整条数据,从每条数据中取输出的属性值 FOR int IN v_table_type.FIRST .. v_table_type.LAST LOOP DBMS_OUTPUT.PUT_LINE('姓名:'||v_table_type(int).name); DBMS_OUTPUT.PUT_LINE('年龄:'|| v_table_type(int).age); DBMS_OUTPUT.PUT_LINE('-------------------------------'); END LOOP; END;输出结果:
姓名:one
年龄:18
-------------------------------
姓名:two
年龄:20
-------------------------------
姓名:three
年龄:24
-------------------------------
一维数组形式使用记录类型:
DECLARE --定义记录表类型 TYPE my_table_type IS TABLE OF varchar2(50) INDEX BY BINARY_INTEGER; --声明变量 v_my_table my_table_type; BEGIN --给数组对象赋值 v_my_table(1) := 'one'; v_my_table(2) := 'two'; v_my_table(3) := 'three'; v_my_table(4) := 'four'; --根据数组下标输出数组值 DBMS_OUTPUT.PUT_LINE(v_my_table(1)); DBMS_OUTPUT.PUT_LINE(v_my_table(2)); DBMS_OUTPUT.PUT_LINE(v_my_table(3)); DBMS_OUTPUT.PUT_LINE(v_my_table(4)); END;输出结果:
one
two
three
four
二维数组形式使用记录类型:
DECLARE --定义记录表类型 TYPE my_table_type IS TABLE OF mytest%ROWTYPE INDEX BY BINARY_INTEGER; --声明变量 v_my_table my_table_type; BEGIN --给数组对象赋值 SELECT name,age INTO v_my_table(1).name,v_my_table(1).age FROM mytest WHERE id = 1; SELECT name,age INTO v_my_table(2).name,v_my_table(2).age FROM mytest WHERE id = 2; SELECT name,age INTO v_my_table(3).name,v_my_table(3).age FROM mytest WHERE id = 3; --根据数组下标输出数组值 DBMS_OUTPUT.PUT_LINE(v_my_table(1).name||' '||v_my_table(1).age); DBMS_OUTPUT.PUT_LINE(v_my_table(2).name||' '||v_my_table(2).age); DBMS_OUTPUT.PUT_LINE(v_my_table(3).name||' '||v_my_table(3).age); END;输出结果:
one 18
two 20
three 24