create or replace type userInfoOther as object (
id number,--用户id
cardid number,--身份证号码
gjjid number,--公积金号码
sbid number--社保号码
);
--实例化一个简单 userInfoOther对象 构造方法就是传入4个属性 也可以全部是 userInfoOther(null,null,null,null);
declare userTmp userInfoOther:=userInfoOther(1,1,1,1);--这里必须构造方法初始化
begin
dbms_output.put_line(userTmp.cardid);
end;
2 创建简单的数组类型
--创建一个可变长度的数组
create or replace type varArray as varray(20) of varchar2(20);
--操作数组
declare varTmp varArray:=varArray();
begin
varTmp.extend();
varTmp(1):='ggg';
varTmp.extend();
varTmp(2):='bbb';
for gg in 1..varTmp.count() loop
dbms_output.put_line(varTmp(gg));
end loop;
end;
3 创建对象的数组类型
--相当于java中的List<userInfoOther>
create or replace type userInfoArray as table of userInfoOther;
declare uia userInfoArray:=userInfoArray();
begin
uia.extend();
uia(1):=userInfoOther(1,123,333,444);
dbms_output.put_line(uia(1).cardid);
end;
4 在plsql中定义临时type
使用对象
declare type medinfo is record( --这里就不能使用 is object了
id number,
name varchar2(20)
);
medTmp medinfo; --:=medinfo(1,'ggg') 临时的不能通过new的方式
begin
medTmp.name:='jiaozi';
dbms_output.put_line(medTmp.name);
end;
使用数组
declare
type workinfo is table of varchar2(20) index by binary_integer;
workTmp workinfo;--不能也不需要 :=workinfo()
begin
workTmp(1):='ggg';--不需要手工调用extend加空间 这里自动的
dbms_output.put_line(workTmp(1));
end;
使用对象数组
declare
type medinfo is record(
id number,
name varchar2(20)
);
type medList is table of medinfo index by binary_integer;
medTmp medList;--不能也不需要 :=workinfo()
begin
--不需要手工调用extend加空间 这里自动的
medTmp(1).name:='jiaozi';
medTmp(1).id:=1;
dbms_output.put_line(medTmp(1).name);
end;
4 将type作为table的属性
--通过object创建type 不同通过record创建 但是临时变量可以用record
create or replace type userInfoOther as object (
id number,--用户id
cardid number,--身份证号码
gjjid number,--公积金号码
sbid number--社保号码
);
--as table of就相当于创建了一个数组 List<userInfoOther> 里面放置的是userInfoOther类型
create or replace type userList as table of userInfoOther;
--用途 用创建的数组直接定义到表的列上 这里要用到内联表的概念(也就是一个表的另一个列也是一个表 )
--nested table 列名 store as 存储名称; 此时会产生courseInfo 和teacherInfo1 两个表 删除courseInfo 也会自动删除和teacherInfo1
create table courseInfo(
id number,
courseName varchar2(20),
teacherInfo userList--授课老师 可能有多个
) nested table teacherInfo store as teacherInfoList;
--插入数据到表中
declare uio userList:=userList();--定义数组 必须初始化
uinfo userInfoOther:=userInfoOther(null,null,null,null);--定义一个用户对象 必须初始化
begin
uio.extend();--数据加入一条数据
uio(1):=userInfoOther(null,null,null,null);--创建一个对象 必须初始化 不然报错
uio(1).id:=1;--对象赋值
uio(1).cardid:=1;
uio(1).gjjid:=1;
uio(1).sbid:=1;
uio.extend();
uio(2):=userInfoOther(null,null,null,null);
uio(2).id:=2;
uio(2).cardid:=2;
uio(2).gjjid:=2;
uio(2).sbid:=2;
uinfo.id:=2;
uinfo.cardid:=2;
uinfo.gjjid:=2;
uinfo.sbid:=2;
uio.extend();
uio(3):=uinfo;--直接将用户对象放入数组
insert into courseInfo(id,courseName,teacherInfo)
values(4,'DDD',uio);
commit;
end;
查询可以通过
select * from table(select teacherinfo from courseinfo)
4 通过type来定义表
--通过type创建 userInfo表对象 但是列名和类型不允许更改
CREATE TABLE userinfo OF userInfoOther;
select * from userinfo
select value(o) from userinfo o