面向對象的Oracle用法

下面介紹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、可變數組更新時必須更新整個可變數組,而嵌套表更新時能夠只更新嵌套表中的部分記錄

相關文章
相關標籤/搜索