table相当于数组,下面是一个table的实例:
declare
/*自定义数组,类型为emp.empno%type,根据Binary_integer索引*/
type mytable is table of emp.empno%type index by Binary_integer;
v_empnos mytable;
begin
/*下标可以为负数*/
v_empnos(-1):=1000;
v_empnos(234):=999;
v_empnos(156):=123;
dbms_output.put_line(v_empnos(156));
end;
%type的意思:比如v_num emp.empno%type; 表示v_num的类型和emp表中的字段empno的字段类型一致。
declare
/*emp.empno%type 表示v_num的类型和emp.empno的类型一致*/
v_num emp.empno%type;
begin
v_num:='234';
dbms_output.put_line(v_num);
end;
Record,相当于一个结构体。
declare
/*自定义类型,相当于结构体*/
type myrecord is Record
(
v_num dept.deptno%type,
v_name dept.dname%type,
v_loc dept.loc%type
);
v_record myrecord;
begin
/*给 v_record变量的每个字段赋值*/
v_record.v_num:=10;
v_record.v_name:='小卖部';
v_record.v_loc:='泉州';
dbms_output.put_line( v_record.v_num ||' '|| v_record.v_name ||' '|| v_record.v_loc );
end;
使用record变量类型时,如果表的结构发生改变(字段增删),这样需要从新定义
record类型,比较麻烦,解决方案可以用rowtype声明record变量类型
declare
v_temp dept%rowtype;
begin
v_temp.deptno:=50;
v_temp.dname:='aaaa';
v_temp.loc:='bj';
dbms_output.put_line(v_temp.deptno||' '||v_temp.dname);
end;