记录和集合
/* 1.记录是为了更方便的处理单行多列,而集合是为了更方便的处理单列多行 */
-- (一 )记录
/* 1. 首先创建一个简单表开始 */
create table test_complex(
id varchar2(20),
username varchar2(20)
); -- 向test_complex 表插入几条记录
insert into test_complex values('1111111','aaaaa');
insert into test_complex values('2222222','bbbbb');
insert into test_complex values('3333333','ccccc');
/* 2. 创建一个记录类型 record
记录类型有两种定义方式:显式定义和隐式定义。
*/ --显示定义
declare
--1.显示定义
type t_record is record (
id test_complex.id%type,
username test_complex.username%type
); r_record t_record ; -- 声明一个记录类型变量r_record
--2.隐式定义
r_record test_complex%rowtype;
--游标定义
cursor c_cursor(v_id) is select id,username from test_complex t where t.id=v_id;
--3.游标定义记录变量
r_record2 c_cursor%rowtype;
begin
for v in (select * from test_complex) loop
r_record.id := v.id;
r_record.username := v.username;
dbms_output.put_line('id='|| r_record.id ||'username='||r_record.username);
end loop;
exception when others then
raise_application_error(-20201,'程序错误 for !');
end; --- select * from tab;
--- select * from test_complex
-- (二) 集合
一个PL/SQL集合中的每一行总是只有一列,这就类似于一维数组。
/* 集合主要包括三种: 索引表,嵌套表,以及数组(array)
1. Index表不能存储在数据库中,但嵌套表和VARRAY可以被存储在数据库中。
索引表语法如下;
TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY BINARY_INTEGER;
关键字是INDEX BY BINARY_INTEGER,没有这个关键字,那么集合将是一个嵌套表。由于不存储在数据库中,
element_type可以是任何合法的PL/SQL数据类型,包括:PLS/INTEGER、SIGNTYPE、和BOOLEAN。
索引表的下标可以为负,并且元素个数没有限制(索引有三种类型 pls_integer,binary_integer 10g开始允许使用varchar2 )
一 :pls_integer 和 binary_integer 一样可以存储 -2^31-2^31
1.存储性能高
2.pls_integer 溢出时会抛出异常,而binary_integer 如果指派给number 则不抛出异常
3.pls_integer 直接由cpu 运算比binary_integer(由oracle 模拟执行)快
*/ type t_tab is table of test_complex%rowtype index by binary_integer;
r_tab t_tab;
SELECT id,username INTO r_tab(0) FROM test_complex WHERE id='1111111';
---------------------------------------------------------------------------
/* 2.嵌套表定义语法如下:
嵌套表非常类似于Index_by表,创建的语法也非常相似。只是没有INDEX BY BINARY_INTEGER子串
TYPE type_name IS TABLE OF element_type [NOT NULL];
存储在一个数据库中的嵌套表并不与表中的其它数据存放在同一个数据块中,它们实际上被存放在第二个表中。
从数据库中取回的嵌套表也不保证元素的顺序。集合数据是离线存储的,所以嵌套表适合大型集合。
区别1:嵌套表下标从1开始并且元素格式不限
区别2:索引表类型不能作为表列的数据类型使用,但嵌套表可以
区别3:嵌套表类型变量使用是必须先被构造方法初始化才能使用
当使用嵌套表作为表列是必须用 eg: create type t_tbl is table of varchar2(2),并且必须要为列指定专门的存储表
create type t__tbl is table of varchar2(10);
/ create table tab_t (
username varchar2(8),
phone t__tab1
) nested table phone store as t__tab1;
如果要处理多行多列则可以采用记录表
eg: type t__tbl is table of tab_t%rowtype in