下面介紹oralce中面向對象的基本語法html
一:抽象數據類型java
建立地址類型,必定要加as object,還能夠在類型中加過程或方法sql
create or replace type address as object (數組
province varchar2(10), --省份屬性函數
city varchar2(10) --市屬性spa
) not final; --not final表示該類型能夠有子類型orm
定義一個子類型,under address說明這個類型繼承至address類型htm
create or replace type detailAddress under address (對象
street varchar2(20) --街道屬性 第3個成員繼承
);
建立員工信息表,最後一列是detailAddress類型
drop table empInfo
create table empInfo (
eName varchar2(20) , --員工姓名
eSex char(2), --性別
eAge int, --年齡
eAddress detailAddress --員工地址
);
--增長數據,只能用構造方法
insert into empInfo values('aaa', '男', 28, detailAddress('湖北', '襄樊', '八一路'));
--查詢
select * from empInfo where eSex = '男';
select * from empInfo e where e.eAddress.city = '武漢'; --若是查詢條件包
含屬性必須用表的別名
--更新有2種方式:
--第一種方式:總體更新
update empInfo e set e.eAddress = detailAddress('湖北', '武漢', '武昌') where e.eName = 'ccc';
--第二種方式:只更新抽象類型的某一列
update empInfo e set e.eAddress.city = '武漢' where e.eName = 'ccc';
--刪除
delete from empInfo e where e.eAddress.city = '武漢';
--爲抽象數據類型的屬性創建索引
create index idxemp on empInfo(eAddress.city);
--刪除
drop table empInfo;
drop type address force; --強制刪除抽象類型
二:對象表,表中的每一行就是一個對象
--建立抽象數據類型person,並做爲基類型
create or replace type person as object (
pName varchar2(20), --姓名
pSex char(2), --性別
pAge int --年齡
) not final;
--建立子類型student,繼承person,後面不要加as object
create or replace type student under person (
stuId int
);
--建立對象表stuInfo
create table stuInfo of student;
--爲對象表建立主鍵約束
alter table stuInfo add constraint pk_stuInfo primary key(stuId);
--插入數據,當普通表插入
insert into stuInfo values('aaa', '男', 29, 1001);
--插入數據,用構造方法
insert into stuInfo values(student('bbb', '男', 26, 1002));
--查詢,當普通表用
select * from stuInfo where stuId = 1002;
--更新和刪除都用普通的sql語句便可
update stuInfo set pAge = 29 where pName = 'ccc';
delete from stuInfo where stuId = 1001;
--ref(表別名)函數用來返回對象的OID,也就是對象標識符,對象表也有rowid
select rowid,ref(s) from stuInfo s;
--建立學生分數表,注意外鍵
create table stuScore (
stu ref student, --stu這一列的值必須出如今stuInfo表中,且stu這一列存的對象的OID而不是對象自己
score int --分數
);
insert into stuscore select ref(s), 90 from stuInfo s where stuId = 1001;
insert into stuscore select ref(s), 80 from stuInfo s; --插入3行數據
insert into stuscore select ref(s), 70 from stuInfo s where stuId = 1003;
--查詢
select * from stuScore;
--deref(列名)函數能夠把OID還原爲對象,主鍵列顯示有問題
select deref(s.stu), score from stuScore s where s.stu.stuId = 1001;
--修改,如下2個均可以
update stuScore set score=100 where stu = (select ref(s) from stuInfo s where stuId = 1001);
update stuScore s set score = 99 where s.stu.stuId = 1001;
--刪除
delete from stuScore where stu = (select ref(s) from stuInfo s where stuId = 1001);
delete from stuScore s where s.stu.stuId = 1001;
三:可變數組
--就是一個能夠存儲多個值的有最大長度的數組,數組的成員能夠是任意類型
--創建一個可變數組類型,長度是10,存放的數據類型是number(4)
create or replace type arrType as varray(10) of number(4);
create or replace type scoreType as object (
subName varchar2(10),
score int
);
--建立一個長度爲10的可變數組,存放數據類型是scorType
create or replace type arrScoreType as varray(10) of scoreType;
--建立學生信息表
--drop table stuInfo;
create table stuInfo (
stuId int primary key,
score arrScoreType --可變數組,最多10個成員
);
--插入數據,用可變數組的構造函數
insert into stuInfo values(1, arrScoreType(
scoreType('sql', 50), scoreType('C#', 80), scoreType('java', 90)));
insert into stuInfo values(2, arrScoreType(
scoreType('sql', 60), scoreType('C#', 85), scoreType('java', 95), scoreType('html', 60)));
insert into stuInfo values(3, arrScoreType(
scoreType('sql', 70), scoreType('java', 93)));
--查詢
select * from stuInfo; --查詢結果是集合
--如何才能查詢出可變數組裏的數據呢?思路是:用table函數把集合轉化爲表,而後再從這個表查詢數據
select * from table(select s.score from stuInfo s where s.stuId = 2);
--table函數裏面只能是一個可變數組
select s.stuId, t.* from stuInfo s,
table(select score from stuInfo where stuId = s.stuId) t
where s.stuId = 2;
--更新,整個可變數組一塊兒更新,不能只更新數組的某個元素
update stuInfo set score = arrScoreType(
scoreType('sql', 50), scoreType('C#', 80)) where stuId = 1;
四:嵌套表
--建立抽象類型
create or replace type scoreType as object (
subName varchar2(10),
score int
);
--建立嵌套表類型
create or replace type nestTable is table of scoreType;
--建立包含嵌套表的學生信息表
create table stuInfo (
stuId int,
score nestTable --其實存的是引用,實際數據存在abc表中
) nested table score store as abc;
--nested table score store as abc意思是:stuInfo這個表中的score這一列是嵌套表類型,嵌套表實際是存在abc這個表中
--增刪和可變數組同樣
insert into stuInfo values(3, nestTable(
scoreType('sql', 70), scoreType('java', 93)));
--查詢,思路:把嵌套表先查出來,而後把嵌套表和stuInfo進行聯合查詢
select * from table(select ss.score from stuInfo ss where stuId = 3);
select s.stuId, t.* from stuInfo s, table(select ss.score from stuInfo ss where stuId = s.stuId) t
where s.stuId = 3;
--更新
update table(select ss.score from stuInfo ss where stuId=3) t
set t.score = 80 where t.subName = 'sql';
--刪除
delete from table(select ss.score from stuInfo ss where stuId = 3) t
where t.subname='sql';
可變數組和嵌套表的異同:
相同點:
1、都是抽象類型
2、均可以做爲表中某列的數據類型(record和快表是不能做爲列的數據類型的)
不一樣點:
1、可變數組自己就存放在原表中,而嵌套表存放在另外的表中
2、可變數組有大小限制,而嵌套表沒有
3、可變數組更新時必須更新整個可變數組,而嵌套表更新時能夠只更新嵌套表中的部分記錄