集合
PL/SQL表
在PL/SQL块中临时使用,象数组一样的对象,但不会用来定义表中的字段;
包含一列和一个主键;不能对列和主键进行命名;
列可以是任何标量数据类型;
主键必须是binary_integer类型;
大小没有限制;
定义PL/SQL表的步骤:
1, 定义表的类型;type typename is table of col_def index by binary_integer;
2, 声明该类型的一个PL/SQL表;tablename typename;
引用PL/SQL表:
使用主键值引用PL/SQL表中的行;
Tablename(key_value)
给PL/SQL表的某行赋值:
Tablename(key_value):=expression;
一个例子:
declare
type student_type is table of varchar(10) index by binary_integer;
stu1 student_type;
begin
stu1(1):='Tom';
stu1(2):='fuck';
for i in 3..10 loop
stu1(i):='com.'||i;
end loop;
for i in 1..10 loop
dbms_output.put_line('The '||i||' is : '||stu1(i));
end loop;
end;
/
PL/SQL表自带了集合函数.delete(i)可以按索引删除第I个元素;
可以不按顺序赋值;
可变数组的宽度是一定的,PL/SQL是无限的,可称为快表;
记录
为什么使用记录?我们知道%rowtype类型可以使我们获得一个行级变量存放整个行;但是为了获得更大的灵活性,我们希望能够定义一个包括了某几个我们需要的字段的变量而不是整个行的所有字段都被包括的变量;这时候我们用记录;
定义类型:type typename is recode(列定义…..);
声明一个该类型的记录变量:recordtype typename;
引用字段:recordname.columnname
赋值:
例子:
declare
type stuRecordType is record
(
id student.stuid%type,
name student.stuname%type,
se student.se%type
);
stuRec stuRecordType;
begin
select stuid,stuname,se into stuRec from student
where stuid='101';
dbms_output.put_line(sturec.id||' '||sturec.name||' '||sturec.se);
exception
when no_data_found then
dbms_output.put_line('no data');
end;
/
一个记录内部可以嵌套其他的记录;
批量绑定:
对PL/SQL变量的赋值;
一次绑定一个集合
提高DML的性能;
Forall关键字用于要在发送到SQL引擎之前对输入集合进行批量绑定;
成员函数和过程
抽象数据类型中定义成员函数和过程;类似Java类中的方法;
构造函数你已经使用过了,它无须显式定义,与对象类型同名;
定义带有函数和过程的对象类型时声明和主体的定义仍然是分开的;
例子:
声明:
create or replace type person_type as object
(
id int,
name varchar(20),
member function getid return int,
member procedure setid(pid int),
member function getname return varchar,
member procedure setname(pname varchar)
) not final;
主体定义:/
create or replace type body person_type as
member function getid return int is
begin
return id;
end getid;
member procedure setid(pid int) as
begin
id:=pid;
end setid;
member function getname return varchar is
begin
return name;
end getname;
member procedure setname(pname varchar) is
begin
name:=pname;
end setname;
end;
/
使用:
1 declare
2 p person_type;
3 begin
4 p:=person_type(1001,'com');
5 dbms_output.put_line('id: '||p.getid);
6 dbms_output.put_line('name: '||p.name);
7 p.setid(1002);
8 p.setname('mike');
9 dbms_output.put_line('id: '||p.getid);
10 dbms_output.put_line('name: '||p.name);
11* end;
id: 1001
name: com
id: 1002
name: mike
其实当我们有了p这个变量后就可以直接访问id: p.id;
我们需要清醒的是这里的类型不是一个表,而是将来可以成为一个表中一个行的类型控制描述;用构造函数构造的只是一个表的一行而不是一个表;当然我们可以用这个类型来定义一个对象表,这样的话,我没什么说的了,因为我已经不明白了;
create table persontable of person_type;
因为对对象表来说我们有两种插入的方法:
insert into persontable values(2001,'fuck');
或构造一个对象插进去:
insert into persontable values(person_type(2002,'me'))
/