Oracle8-對象關(guān)系數(shù)據(jù)庫課件_第1頁
Oracle8-對象關(guān)系數(shù)據(jù)庫課件_第2頁
Oracle8-對象關(guān)系數(shù)據(jù)庫課件_第3頁
Oracle8-對象關(guān)系數(shù)據(jù)庫課件_第4頁
Oracle8-對象關(guān)系數(shù)據(jù)庫課件_第5頁
已閱讀5頁,還剩271頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

Oracle8對象關(guān)系數(shù)據(jù)庫1........Oracle8對象關(guān)系數(shù)據(jù)庫1...1高端數(shù)據(jù)庫-提高DBMS管理上限Oracle8對象關(guān)系數(shù)據(jù)庫擴(kuò)充的類型系統(tǒng)對象關(guān)系數(shù)據(jù)庫Oracle8數(shù)據(jù)庫系統(tǒng)

........高端數(shù)據(jù)庫-提高DBMS管理上限Oracle8數(shù)據(jù)庫系統(tǒng)

一、高端數(shù)據(jù)庫-提高DBMS管理上限

oracle7 oracle8

數(shù)據(jù)庫大小 32TB 512KTB 數(shù)據(jù)文件個數(shù) 1-4K 64-256M每表包含列 數(shù) 254 1000 每表的LOB列數(shù) 1long 1000 CHAR長度 254 2000VARCHAR長度 2000 4000索引列數(shù) 16 32 ........一、高端數(shù)據(jù)庫-提高DBMS管理上限 oracl支持上萬個并發(fā)用戶多線程服務(wù)器(用少量的服務(wù)器端進(jìn)程管理大量的客戶端用戶。Net8(SQL*net)連接管理器—連接池(TNS資源)、多路傳輸、應(yīng)用請求集中化更有效地使用網(wǎng)絡(luò)資源避免操作系統(tǒng)對服務(wù)器網(wǎng)絡(luò)連接數(shù)的限制客戶端(服務(wù)器)服務(wù)器一、高端數(shù)據(jù)庫-提高DBMS管理上限網(wǎng)絡(luò)層透明網(wǎng)絡(luò)底層協(xié)議適配器........支持上萬個并發(fā)用戶一、高端數(shù)據(jù)庫-提高DBMS管理上限網(wǎng)絡(luò)層二、擴(kuò)充的類型系統(tǒng)

-對象關(guān)系數(shù)據(jù)庫

關(guān)系模型與對象模型新的數(shù)據(jù)類型-對象(記錄)類型對象表—面向?qū)ο髷?shù)據(jù)庫設(shè)計收集類型(數(shù)組與嵌套表)

對象與視圖

........二、擴(kuò)充的類型系統(tǒng)

-對象關(guān)系數(shù)據(jù)庫..數(shù)據(jù)庫新的應(yīng)用領(lǐng)域計算機(jī)輔助設(shè)計

CAD數(shù)據(jù)庫必須存儲和處理與工程設(shè)計相關(guān)的數(shù)據(jù)(產(chǎn)品部件及相互關(guān)系、設(shè)計版本…)計算機(jī)輔助軟件工程數(shù)據(jù)庫中存儲軟件開發(fā)人員用到的各種數(shù)據(jù),包括源代碼、模塊之間依賴關(guān)系、變量定義、文檔…多媒體數(shù)據(jù)庫聲音、視頻、圖象…辦公信息系統(tǒng)超文本數(shù)據(jù)庫........數(shù)據(jù)庫新的應(yīng)用領(lǐng)域計算機(jī)輔助設(shè)計...應(yīng)用需要新的數(shù)據(jù)類型——論文檢索系統(tǒng)論文標(biāo)題作者列表(第一作者,第二作者,找出某人參與撰寫的所有論文…)檢索關(guān)鍵字發(fā)表日期(年月日分開)........應(yīng)用需要新的數(shù)據(jù)類型——論文檢索系統(tǒng).傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)類型復(fù)雜屬性只能拆分成并列的單一屬性姓名,地址(省、市、區(qū)、街道、門牌號)本來是一個結(jié)合緊密的整體,在關(guān)系數(shù)據(jù)庫中卻只能拆成單一屬性,與其他屬性并列(如姓名、年齡等),沒有反映出它們的緊密關(guān)系。無法表示變長的屬性家庭記錄有幾個孩子長字段設(shè)幾個字段(不好估計)家庭編號戶主子女1子女2子女3…........傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)類型復(fù)雜屬性只能拆分成并列的單一屬性家庭傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)類型無法直接表示嵌套表例:一張發(fā)貨單,發(fā)三種貨物:放3條記錄,但公共信息存3遍(查詢方便)拆成兩張表(發(fā)貨單,發(fā)送貨物),需要連接,費(fèi)時,且要清楚表與表的關(guān)系貨單號發(fā)貨人貨物日期…發(fā)往地貨物名稱價格數(shù)量........傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)類型無法直接表示嵌套表貨單號發(fā)貨人貨物日關(guān)系數(shù)據(jù)庫的數(shù)據(jù)模型數(shù)據(jù)模型是模型化數(shù)據(jù)和信息的工具?,F(xiàn)實(shí)世界認(rèn)識抽象信息世界-概念數(shù)據(jù)模型機(jī)器世界-DBMS支持的數(shù)據(jù)模型關(guān)系模型轉(zhuǎn)換........關(guān)系數(shù)據(jù)庫的數(shù)據(jù)模型數(shù)據(jù)模型是模型化數(shù)據(jù)和信息的工具。現(xiàn)實(shí)世數(shù)據(jù)模型演變文件系統(tǒng)(OS)層次模型——網(wǎng)狀模型——關(guān)系模型(DB)特點(diǎn):面向記錄,信息由定長記錄組成。記錄簡單(短小)。原子字段,字段不再含有結(jié)構(gòu)。........數(shù)據(jù)模型演變文件系統(tǒng)(OS)...關(guān)系模型的特點(diǎn)強(qiáng)調(diào)數(shù)據(jù)的獨(dú)立性(以數(shù)據(jù)為中心),數(shù)據(jù)與程序分離。采用關(guān)系模型、概念單一,實(shí)體和聯(lián)系都是用關(guān)系來表示。關(guān)系必須是規(guī)范化的關(guān)系,要求每一分量不可再分。支持關(guān)系語言,具有高度非過程化,支持集合運(yùn)算通過外來碼實(shí)現(xiàn)表的連接(多表查詢)........關(guān)系模型的特點(diǎn)強(qiáng)調(diào)數(shù)據(jù)的獨(dú)立性(以數(shù)據(jù)為中心),數(shù)據(jù)與程序分Oracle8—擴(kuò)充的類型系統(tǒng)是對關(guān)系數(shù)據(jù)模型進(jìn)行的擴(kuò)充。提供更為豐富的面向?qū)ο蟮念愋拖到y(tǒng)。擴(kuò)充的類型系統(tǒng)允許元組的屬性值為復(fù)雜類型,在關(guān)系查詢語言中增加處理新數(shù)據(jù)類型的成分。既保留關(guān)系模型基礎(chǔ)又提高建模能力對象關(guān)系模型為希望使用面向?qū)ο筇卣鞯年P(guān)系數(shù)據(jù)庫用戶提供可能。........Oracle8—擴(kuò)充的類型系統(tǒng)是對關(guān)系數(shù)據(jù)模型進(jìn)行的擴(kuò)充。面向?qū)ο蟮幕靖拍蠲嫦驅(qū)ο蠓椒ㄊ且砸鉀Q的問題中所涉及到的各種對象為主要考慮因素。對象是一種看問題的觀點(diǎn),是對現(xiàn)實(shí)世界各種元素的一種抽象。對象既含數(shù)據(jù)又含功能,因此具有自身處理數(shù)據(jù)的能力。對象被認(rèn)為是迄今為止最接近真實(shí)事物的數(shù)據(jù)抽象?,F(xiàn)實(shí)世界中對象有兩個共同的特點(diǎn):一方面,它們都有自己的狀態(tài)。如一臺電視機(jī)有自己的擺放位置,有關(guān)機(jī)和開機(jī)狀態(tài),此刻正在播放某一頻道的電視節(jié)目等另一方面,它們又都有自己的行為,如電視機(jī)的開機(jī)、關(guān)機(jī)、調(diào)臺等。........面向?qū)ο蟮幕靖拍蠲嫦驅(qū)ο蠓椒ㄊ且砸鉀Q的問題中所涉及到的各面向?qū)ο蟮幕靖拍?/p>

內(nèi)部實(shí)現(xiàn)(封裝)接口屬性、方法能動的主體使電腦貼近人腦的思維模式(減少人認(rèn)識問題時的認(rèn)識空間和計算機(jī)處理問題時的方法空間的不一致性)。實(shí)現(xiàn)軟件的復(fù)用(軟件芯片)。........面向?qū)ο蟮幕靖拍顑?nèi)部實(shí)現(xiàn)接口能動的主體使電腦貼近人腦的思對象的屬性與方法面向?qū)ο蟪绦蛟O(shè)計中的對象是現(xiàn)實(shí)世界對象的模型化,它同樣具有狀態(tài)和行為。對象的狀態(tài)用屬性來維護(hù),對象的行為用方法來實(shí)現(xiàn)。因此可以簡單地講,對象是面向?qū)ο蟮某绦蛟O(shè)計模式,它由描述對象狀態(tài)的屬性(變量)和用來實(shí)現(xiàn)對象行為的方法(代碼)組成。........對象的屬性與方法面向?qū)ο蟪绦蛟O(shè)計中的對象是現(xiàn)實(shí)世界對象的模型對象與類相關(guān)對象的集合稱為

類(Class)類是對象的抽象及描述,它是具有統(tǒng)一屬性和方法的多個對象的統(tǒng)一描述體,是用來定義一組對象共有屬性和方法的模板。類是用來創(chuàng)建對象實(shí)例的樣板,它包含所創(chuàng)建對象的狀態(tài)描述和方法的定義。類是一個型,而對象則是這個型的一個實(shí)例。類是靜態(tài)概念,而對象則是一個動態(tài)概念,因?yàn)橹挥性谶\(yùn)行時才給對象分配空間,對象才真正存在。........對象與類相關(guān)對象的集合稱為類(Class)...面向?qū)ο蟮臄?shù)據(jù)模型在一些應(yīng)用中,用戶將數(shù)據(jù)庫中的數(shù)據(jù)看作是一組對象而非一組記錄。面向?qū)ο蟮臄?shù)據(jù)模型是面向?qū)ο蟪绦蛟O(shè)計思想在數(shù)據(jù)庫系統(tǒng)中的應(yīng)用?;舅枷搿獙?shù)據(jù)和操作這些數(shù)據(jù)的程序代碼封裝在一個對象里。將一個對象存儲在數(shù)據(jù)庫中:對象的數(shù)據(jù)部分必須針對各個對象分別存儲。而實(shí)現(xiàn)類方法的程序代碼應(yīng)該和類的定義一起作為數(shù)據(jù)庫模式的一部分存儲。........面向?qū)ο蟮臄?shù)據(jù)模型在一些應(yīng)用中,用戶將數(shù)據(jù)庫中的數(shù)據(jù)看作是一面向?qū)ο髷?shù)據(jù)庫數(shù)據(jù)庫中不是只存儲單純的數(shù)據(jù),而是存儲包含屬性和方法的對象。對于一個數(shù)據(jù)庫對象,可定義在其上運(yùn)行的過程和函數(shù)。使數(shù)據(jù)庫中的數(shù)據(jù)和訪問該數(shù)據(jù)的方法聯(lián)系起來,可標(biāo)準(zhǔn)化數(shù)據(jù)訪問的方法并提高對象的可復(fù)用性。應(yīng)用邏輯從應(yīng)用程序中移動到數(shù)據(jù)庫中(對象方法)創(chuàng)建通用的數(shù)據(jù)庫對象,并能成為數(shù)據(jù)庫對象的標(biāo)準(zhǔn),可實(shí)現(xiàn)數(shù)據(jù)庫對象的重用。........面向?qū)ο髷?shù)據(jù)庫數(shù)據(jù)庫中不是只存儲單純的數(shù)據(jù),而是存儲包含屬性數(shù)據(jù)模型現(xiàn)實(shí)世界認(rèn)識抽象信息世界-概念數(shù)據(jù)模型機(jī)器世界-DBMS支持的數(shù)據(jù)模型對象模型轉(zhuǎn)換........數(shù)據(jù)模型現(xiàn)實(shí)世界認(rèn)識信息世界-概念數(shù)據(jù)模型機(jī)器世界-轉(zhuǎn)換.對象模型與關(guān)系模型對象模型對象類型的屬性描述對象類型的方法封裝了操作該對象的代碼。提供了處理數(shù)據(jù)庫中數(shù)據(jù)的界面。關(guān)系模型二維表中列的定義沒有方法另編程可使用操作某數(shù)據(jù)庫表的存儲過程。面向?qū)ο髷?shù)據(jù)模型中的類概念—實(shí)體集概念。面向?qū)ο髷?shù)據(jù)模型中的對象概念—實(shí)體概念........對象模型與關(guān)系模型對象模型關(guān)系模型面向?qū)ο髷?shù)據(jù)模型中的類概念對象模型與關(guān)系模型關(guān)系模型可用二維表來表示——關(guān)系表:屬性—二維表的列元組—二維表的行對象模型可用二維表來表示——對象表:用一個類(對象類型)定義一個對象表類的屬性—二維表的列對象(類的實(shí)例)—二維表的行(行對象)通過對象調(diào)用對象方法。........對象模型與關(guān)系模型關(guān)系模型可用二維表來表示——關(guān)系表:Oracle的擴(kuò)充類型Oracle是一個開放的類型系統(tǒng),增加了復(fù)雜的數(shù)據(jù)類型以及用戶自定義類型用戶定義的數(shù)據(jù)類型使得可以在數(shù)據(jù)庫中為現(xiàn)實(shí)世界的對象建模對象類型(記錄類型)數(shù)組類型嵌套表類型創(chuàng)建對象表,實(shí)現(xiàn)面向?qū)ο蟮臄?shù)據(jù)庫設(shè)計(而非關(guān)系型數(shù)據(jù)庫設(shè)計。應(yīng)用邏輯從應(yīng)用程序中移動到數(shù)據(jù)庫中(對象方法)........Oracle的擴(kuò)充類型Oracle是一個開放的類型系統(tǒng),增加擴(kuò)充類型的不同應(yīng)用對象類型數(shù)組類型嵌套表類型

關(guān)系表對象表對象類型........擴(kuò)充類型的不同應(yīng)用對象類型數(shù)組類型嵌套表類型利用對象類型

定義復(fù)合數(shù)據(jù)類型25........利用對象類型

定義復(fù)合數(shù)據(jù)類型25...25用戶自定義數(shù)據(jù)類型使用對象類型定義一個記錄數(shù)據(jù)類型

CREATETYPEname_typeASOBJECT (first_name VARCHAR2(4), last_name VARCHAR2(4));

CREATETYPEaddress_typeASOBJECT ( city VARCHAR2(10), street VARCHAR2(10), zip NUMBER(6));

CREATETABLEworker(widNUMBER(5)PRIMARYKEY,wnamename_type,

addressaddress_type);........用戶自定義數(shù)據(jù)類型使用對象類型定義一個記錄數(shù)據(jù)類型...對象類型數(shù)據(jù)的操作

使用對象類型聲明了關(guān)系表中的列,DML語句必須用一些特殊的語法插入新記錄時,對于對象類型的列,要使用構(gòu)造函數(shù)構(gòu)造出對應(yīng)類型的數(shù)據(jù)。構(gòu)造函數(shù)是對象類型的特殊方法,利用此方法為該類型創(chuàng)建對象。構(gòu)造方法的名稱與對象類型(類)同名。對記錄型數(shù)據(jù)的分量進(jìn)行操作時,要使用“別名”........對象類型數(shù)據(jù)的操作使用對象類型聲明了關(guān)系表中的列,DML語對象類型數(shù)據(jù)的操作插入語句例:insertintoworkervalues(1,name_type('王','至遠(yuǎn)'),

address_type('北京','白頤路5號',100084));insertintoworkervalues(2,name_type(‘張’,‘大年'),

address_type(‘天津’,‘康寧里20號’,300072));insertintoworkervalues(3,name_type('趙','力平'),

address_type('上海','南京路23號',200092));........對象類型數(shù)據(jù)的操作插入語句例:...對象類型數(shù)據(jù)的查詢查詢語句1select*fromworker;

WIDNAME(FIRST_NAME,LAST_NAME)ADDRESS(CITY,STREET,ZIP)-----------------------------------------------------------------------------------------------------

1NAME_TYPE(‘王’,‘至遠(yuǎn)’)ADDRESS_TYPE('北京','白頤路5號',100084)2NAME_TYPE(‘張’,‘大年’)ADDRESS_TYPE(‘天津’,‘康寧里20號’,300072)3NAME_TYPE(‘趙’,‘力平’)ADDRESS_TYPE(‘上?!?‘南京路23號’,200092)查詢語句2selectwid,wnamefromworker;WIDNAME(FIRST_NAME,LAST_NAME)----------------------------------------------------------

1NAME_TYPE(‘王’,‘至遠(yuǎn)’)2NAME_TYPE(‘張’,‘大年’)3NAME_TYPE(‘趙’,‘力平’)........對象類型數(shù)據(jù)的查詢查詢語句1...對象類型數(shù)據(jù)的查詢查詢語句3(用別名)selectwid顧客編號,w.address.city城市,

w.address.street街道,w.address.zip郵編fromworkerw;顧客編號城市街道郵編-------------------------------------------------1北京白頤路5號1000842天津康寧里20號3000723上海南京路23號200092查詢語句4(別名的使用)select*fromworkerworderbyw.address.zip........對象類型數(shù)據(jù)的查詢查詢語句3(用別名)...對象類型數(shù)據(jù)的操作修改updateworkerwsetw.address.zip=100083wherewid=1;刪除deletefromworkerwherewid=1;.first_name=‘王’;修改表結(jié)構(gòu)altertablecustadd(address1address_type);不能對表修改自定義的數(shù)據(jù)類型格式........對象類型數(shù)據(jù)的操作修改...用戶自定義數(shù)據(jù)類型對象類型更加貼近現(xiàn)實(shí)世界的數(shù)據(jù)特征。使用對象類型可以更加統(tǒng)一、自然地聲明和操作表中的數(shù)據(jù)(在整個數(shù)據(jù)庫中地址一致性)創(chuàng)建可為大家引用的新數(shù)據(jù)類型:創(chuàng)建一個模式(如pub)建立公共對象類型(新數(shù)據(jù)類型)設(shè)置必要的權(quán)限使用CREATEPROCEDUREnew_worker(

widNUMBER,_type,

addresspub.address_type)........用戶自定義數(shù)據(jù)類型對象類型更加貼近現(xiàn)實(shí)世界的數(shù)據(jù)特征。..自定義數(shù)據(jù)類型上的索引createindexaaaonworker(wname);ORA-02327:無法在具有數(shù)據(jù)類型ADT的列上創(chuàng)建索引。(即使在name_type類中定義了排序方法也不可以)如經(jīng)常進(jìn)行如下查詢:selectwid顧客編號,w.address.city城市,

w.address.street街道,w.address.zip郵編fromworkerwwherew.address.zip=100084;可建索引如下:createindexI_ziponworker(address.zip);........自定義數(shù)據(jù)類型上的索引createindexaaaon使用對象表

—面向?qū)ο髷?shù)據(jù)庫設(shè)計34........使用對象表

—面向?qū)ο髷?shù)據(jù)庫設(shè)計34...34建立對象表的類建類型(對象類型聲明)createtype類型名asobject(

屬性名1類型說明,屬性名2類型說明,…...

memberfunction函數(shù)名(參數(shù)說明)

return返回類型,

memberprocedure過程名(參數(shù)說明),…);方法說明屬性說明........建立對象表的類建類型(對象類型聲明)方法說明屬性說明對象屬性類型對象類型必須包含一個或多個屬性,屬性的類型可以是:Oracle的原始數(shù)據(jù)類型、LOB對象對象的引用(REF)收集(COLLECTION)等........對象屬性類型對象類型必須包含一個或多個屬性,屬性的類型可以是對象方法方法是一個過程或函數(shù),是對象類型定義的一部分,是程序員編寫的用于操縱對象屬性的子程序,被封裝在對象類型中。方法的種類:成員方法(member)構(gòu)造方法(constructor)MAP或ORDER方法(排序方法)一個類可以有多個方法(也可以不定義方法)對象類型不存儲數(shù)據(jù);必須創(chuàng)建相應(yīng)的表來存儲數(shù)據(jù)........對象方法方法是一個過程或函數(shù),是對象類型定義的一部分,是程編寫方法代碼建類型體(實(shí)現(xiàn)類成員方法)createtypebody類型名ASmemberfunction函數(shù)方法名(參數(shù)說明)

return返回類型is

說明部分begin

執(zhí)行部分end;memberprocedure過程方法名(參數(shù)說明)is

說明部分begin

執(zhí)行部分end;END;方法實(shí)現(xiàn)方法實(shí)現(xiàn)........編寫方法代碼建類型體(實(shí)現(xiàn)類成員方法)方法實(shí)現(xiàn)方法實(shí)現(xiàn)..建立對象表建對象表

Createtable表名of對象類型(…);例:CREATETYPEemployee_typeASOBJECT(...);CREATETABLEemployeesOFemployee_type(empnoconstrainte1primarykey);CREATETYPEBODYemployee_type(…);表定義的其他說明,如完整性約束等,表的列不能再定義........建立對象表建對象表表定義的其他說明,如完整性約束等,表的列不建立對象類型例CREATETYPEemployee_typeASOBJECT(empno NUMBER(3),ename VARCHAR2(10),salNUMBER(6.2),hiredateDATE,MEMBERFUNCTIONdays_at_companyRETURNNUMBER,MEMBERPROCEDUREraise_salary(increment_salNUMBER));/........建立對象類型例CREATETYPEemployee_創(chuàng)建對象表CREATETABLEemployeesOFemployee_type(PRIMARYKEY(empno),UNIQUE(ename),CHECK(sal>300));........創(chuàng)建對象表CREATETABLEemployeesOF建立對象類型體CREATEORREPLACETYPEBODYemployee_typeASMEMBERFUNCTIONdays_at_companyRETURNNUMBERIS BEGIN RETURNfloor(sysdate-hiredate); END;MEMBERPROCEDUREraise_salary(increment_salNUMBER)IS BEGIN UPDATEemployeesSETsal=sal+increment_salWHEREempno=SELF.empno; END;END;........建立對象類型體CREATEORREPLACETYPE對方法的限制編譯軟件包中的函數(shù)或過程時,可以使用PRAGMA編譯指令通知PL/SQL編譯器禁止某方法對數(shù)據(jù)庫表和包中的變量讀寫,當(dāng)方法體中出現(xiàn)違反情況時,編譯出錯。格式:

PRAGMARESTRICT_REFERENCES(function_name,WNDS[,WNPS][,RNDS][,RNPS]);WNDS不允許寫數(shù)據(jù)庫

RNDS不允許讀數(shù)據(jù)庫

WNPS不允許改程序包變量

RNPS不允許引用程序包變量........對方法的限制編譯軟件包中的函數(shù)或過程時,可以使用PRAGM對方法的限制CREATEORREPLACETYPEemployee_typeASOBJECT(empno NUMBER,ename VARCHAR2(10),salNUMBER,hiredateDATE,MEMBERFUNCTIONdays_at_companyRETURNNUMBER,MEMBERPROCEDUREraise_salary(increment_salNUMBER),PRAGMARESTRICT_REFERENCES(days_at_company,WNDS,WNPS));........對方法的限制CREATEORREPLACETYPE對方法的限制CREATEORREPLACETYPEBODYemployee_typeASMEMBERFUNCTIONdays_at_companyRETURNNUMBERIS BEGIN RETURNfloor(sysdate-hiredate);UPDATEemployeesSEThiredate=hiredate+30;--

END;

…..END;-----------------------------------------------------------------------0/0PL/SQL:Compilationunitanalysisterminated2/10PLS-00452:子程序'DAYS_AT_COMPANY'違反了它的相關(guān)編譯指令........對方法的限制CREATEORREPLACETYPE對象類型--構(gòu)造子方法Oracle自動地為每個對象類型創(chuàng)建一個構(gòu)造方法。構(gòu)造子方法的名稱采用對象類型名。構(gòu)造子方法的參數(shù)即對象類型的所有屬性。構(gòu)造子方法初始化一個對象類型的實(shí)例,并將它的屬性賦值。例:insertintoemployeesvalues(employee_type(1,‘Jone’,500,‘5-10月-1989’));........對象類型--構(gòu)造子方法Oracle自動地為每個對象類型創(chuàng)建對象表操作建表

createtableemployeesofemployee_type;插入數(shù)據(jù)insertintoemployeesvalues(employee_type(1,‘Jone’,500,‘5-10月-1989’));insertintoemployees--省略構(gòu)造方法values(1,‘Jone’,1500,‘5-10月-1989’);insertintoemployeesvalues(2,'smith',700,‘10-5月-1997');insertintoemployeesvalues(3,‘king’,900,’25-12月-2000’);........對象表操作建表....獲取行對象—value函數(shù)value(對象表別名)返回一個行對象(對象類型)value用于從對象表中取得對象實(shí)例。

不使用value,SELECT只能返回一個對象的各個列值。select*fromemployees;EMPNOENAMESALHIREDATE----------------------------------------------------------------------------------

1Jone150005-10月-892smith70010-5月-973king90025-12月-00selectvalue(e)fromemployeese;VALUE(E)(EMPNO,ENAME,HIREDATE)--------------------------------------------------------------------EMPLOYEE_TYPE(1,'Jone',1500,‘05-10月-89')EMPLOYEE_TYPE(2,’smith',700,'10-5月-97')EMPLOYEE_TYPE(3,’king',900,‘25-12月-00')........獲取行對象—value函數(shù)value(對象表別名)返回一個行對象表方法調(diào)用selectename,hiredatefromemployeeswhereempno=1;EMPNAMEHIREDATE--------------------------------------------Jone05-10月-89selectename,e.days_at_company()daysfromemployeesewhereempno=3;EMPNAMEDAYS-----------------------------------------------------------------------------------------------------------------king45使用別名........對象表方法調(diào)用selectename,hiredate在PL/SQL程序中,取得的對象實(shí)例必須被相同類型的對象變量接收。例:declareempemployee_type;beginselectvalue(e)intoempfromemployeesewhereempno=1;emp.raise_salary(500);end;/PL/SQL中對象方法的調(diào)用........在PL/SQL程序中,取得的對象實(shí)例必須被相同類型的對象變量PL/SQL中對象方法的調(diào)用DECLARE emp_variable employee_type; days_employed number;BEGINSELECTVALUE(e)INTOemp_variableFROMemployeeseWHEREe.empno=3;days_employed:=emp_variable.days_at_company();dbms_output.put_line(‘Daysemployed:‘|| to_char(days_employed));END;/........PL/SQL中對象方法的調(diào)用DECLARE...附:PL/SQL輸出與環(huán)境設(shè)置執(zhí)行結(jié)果:Daysemployed:26PL/SQL輸出(利用包過程)dbms_output.put_line(‘…’);環(huán)境設(shè)置

execdbms_output.enable

setserveroutputon........附:PL/SQL輸出與環(huán)境設(shè)置執(zhí)行結(jié)果:...對象方法小結(jié)對象類型總是有1到多個方法(構(gòu)造方法是隱含方法,成員方法為0~n個。成員方法可以帶輸入輸出參數(shù)。每個成員方法含有名為SELF的隱含第一參數(shù),它具有與對象類型自身相同的類型。定義函數(shù)方法,如沒參數(shù)不用寫括號,但調(diào)用時要寫括號。定義方法形參時,類型不用寫長度,如varchar2........對象方法小結(jié)對象類型總是有1到多個方法(構(gòu)造方法是隱含方法,對象表的特性對象表是只用對象類型定義的數(shù)據(jù)庫表,不含關(guān)系型列。對象表的列對應(yīng)(用來創(chuàng)建表的)對象類型的屬性。對象表的行是表類型的對象(實(shí)例),每一行都有一個系統(tǒng)分配的唯一的對象標(biāo)識符(OID)對象ID(OID)是每一個行對象的唯一描述符,是全局唯一的,并且可以引用OID不用于定位數(shù)據(jù),ROWID仍用于定位數(shù)據(jù)oracle通過對象引用實(shí)現(xiàn)數(shù)據(jù)庫中不同對象之間的聯(lián)系(與關(guān)系表完全不同)........對象表的特性對象表是只用對象類型定義的數(shù)據(jù)庫表,不含關(guān)系型列獲取對象引用—ref

函數(shù)具有OID的對象實(shí)例可以被引用(REF)ref(對象表的別名)返回對象表實(shí)例指針,即行對象的引用。例:selectref(e)fromemployeese;

REF(e)------------------------------------------------------------------------------------------------------------------------------------------------------------------000028020965D...0BEFE0340800209ADC5901403BE50000000028020965D...0BEFE0340800209ADC5901403BE50001000028020965D...0BEFE0340800209ADC5901403BE50002........獲取對象引用—ref函數(shù)具有OID的對象實(shí)例可以被引用(R對象引用例建立對象表custCreatetypecust_typeasobject(custid number(5),name name_type,address address_type);

createtablecustofcust_type(custidprimarykey);........對象引用例建立對象表cust...對象引用例向cust表中插入數(shù)據(jù)insertintocustvalues(1,name_type('王','至遠(yuǎn)'),

address_type(‘北京’,‘白頤路5號’,100084));insertintocustvalues(2,name_type(‘張’,‘大年'),

address_type('天津','康寧里20號',300072));insertintocustvalues(3,name_type('趙','力平'),

address_type('上海','南京路23號',200092));........對象引用例向cust表中插入數(shù)據(jù)...對象引用例查詢cust表select*fromcustwherecustid=1;selectc.address.city,.first_name=‘王’;修改cust表結(jié)構(gòu)???altertablecustadd(address1address_type);不允許?。?!........對象引用例查詢cust表...對象引用例建立goods_typeCREATETYPEgoods_typeASOBJECT(gnoNUMBER(3),gnamevarchar2(20),pricenumber(6,2));/CREATETABLEgoodsOFgoods_type(constraintp1primarykey(gno));INSERTINTOgoodsVALUES(101,'電視機(jī)',2900);INSERTINTOgoodsVALUES(102,'洗衣機(jī)',1500);........對象引用例建立goods_type...對象引用例CREATETYPEorder_typeASOBJECT(orderid NUMBER(3),customer REFcust_type,orderdate DATE,qty NUMBER(5),gno NUMBER(3));/........對象引用例CREATETYPEorder_typeASCREATETABLEordersOForder_type(FOREIGNKEY(gno)REFERENCESgoods(gno));對象引用例----customer----gnonumberorders----2張大年----custgno----goodsOID=........CREATETABLEordersOForder_t對象表—對象引用REF是指向行對象的指針,易于實(shí)現(xiàn)表和表之間的聯(lián)系,對象之間連接不再需要關(guān)系表的連接(JOIN)操作。將對象表的表別名作為REF的參數(shù),可以取得對應(yīng)OID的引用值。引用只能用于具有OID的對象。customer REF cust_typeSCOPEISCUSTSCOPE子句用于限定一個引用在一個指定表中,這樣可以提高查詢性能,并減少存儲指針的空間。........對象表—對象引用REF是指向行對象的指針,易于實(shí)現(xiàn)表和表之間INSERTINTOordersSELECT1,ref(c),‘7-1月-2000’,165,101

FROMcustc WHEREcustid=1;UPDATEorders SETcustomer=(SELECTREF(c)FROMcustc WHEREcustid=2) WHEREorderid=1;引用類型數(shù)據(jù)的操作........INSERTINTOorders引用類型數(shù)據(jù)的操作.引用類型數(shù)據(jù)的操作SELECTcustomerFROMordersWHEREorderid=1;22020865F009D0AC262…42A35E0340800…SELECTo.customer.custid顧客號,

.last_name名,orderdate日期FROMordersoWHEREorderid=1

顧客號名日期---------------------------

2

大年07-1月-00........引用類型數(shù)據(jù)的操作SELECTcustomer...對象引用—簡化了代碼數(shù)據(jù)庫管理對象間的連系,用戶只需通過屬性進(jìn)行對象的引用。在關(guān)系設(shè)計中,開發(fā)人員必須使用聯(lián)接(JOIN)SELECTname,address,...FROMorderso,custcWHEREo.custid=c.custidandorderid=1;........對象引用—簡化了代碼數(shù)據(jù)庫管理對象間的連系,用戶只需通過屬性deref函數(shù)deref(ref指針)返回指針指向的對象本身例:selectderef(customer)fromorderswhereorderid=1;DEREF(CUSTOMER)(CUSTID,NAME(FIRST_NAME,LAST_NAME),ADDRESS(CITY,STREET,ZIP))---------------------------------------------------------------------------------CUST_TYPE(2,NAME_TYPE(‘張’,‘大年’),ADDRESS_TYPE(‘天津’,‘康寧里20號’,300072))試比較:selectderef(ref(c))fromcustcwherecustid=2;和selectvalue(c)fromcustcwherecustid=2;........deref函數(shù)deref(ref指針)返回指針指向的對象本SQL語句中的排序和比較傳統(tǒng)的數(shù)據(jù)類型主要為標(biāo)量數(shù)據(jù)類型:

number,char,date標(biāo)量數(shù)據(jù)類型可以排序(如orderby…)排序在SQL語句的使用:關(guān)系運(yùn)算(><=)between及in的判斷orderbygroupbydistinct子句unique和primarykey約束

自定義數(shù)據(jù)類型如何排序selectwname,

addressfromworkerorderbyaddress;錯誤位于第2行:ORA-22950:無法ORDER沒有MAP或ORDER方法的對象........SQL語句中的排序和比較傳統(tǒng)的數(shù)據(jù)類型主要為標(biāo)量數(shù)據(jù)類型:對象類型的排序方法同類的排序?qū)χС钟脩舳x的對象類型很重要。對象類型由于結(jié)構(gòu)復(fù)雜,必須借助方法實(shí)現(xiàn)排序和比較。MAP方法將對象類型轉(zhuǎn)換為傳統(tǒng)數(shù)據(jù)類型。ORDER方法提供排序規(guī)則。比較本對象和另一對象實(shí)例,并返回1,0,-1分別代表大于、等于、小于。一個對象類型只能有一個MAP方法或一個ORDER方法:mapmemberfunction…ordermemberfunction…........對象類型的排序方法同類的排序?qū)χС钟脩舳x的對象類型很重要。MAP方法例對象類型---->標(biāo)量類型方法返回一個傳統(tǒng)數(shù)據(jù)類型用于排序。沒有輸入?yún)?shù)(只有一個隱含參數(shù)SELF)。方法被隱含調(diào)用。在類型定義中說明MAP方法:CREATETYPEname_typeASOBJECT( first_namevarchar2(4), last_namevarchar2(4),MAPMEMBERFUNCTIONname_map RETURNvarchar2);........MAP方法例對象類型---->標(biāo)量類型...在類型體中實(shí)現(xiàn)MAP方法:CREATETYPEBODYname_typeASMAPMEMBERFUNCTIONname_mapRETURNvarchar2ISBEGIN

RETURNfirst_name||last_name;END;END;排序:SELECTcustid,c.address.cityFROMcustcORDERBYnamedesc;任何基于name_type類型的排序按名稱的拼接串作為大小比較的依據(jù)。MAP方法例MAP方法隱含調(diào)用........在類型體中實(shí)現(xiàn)MAP方法:任何基于name_type類型的排ORDER

方法決定類型實(shí)例的序列關(guān)系。有一個參數(shù)(外加一個隱含的參數(shù)SELF)函數(shù)方法返回一個整數(shù)如果對象自身比參數(shù)對象小,返回-1如果對象自身與參數(shù)對象相等,返回0如果對象自身比參數(shù)對象大,返回1........ORDER方法決定類型實(shí)例的序列關(guān)系。...ORDER

方法例1在類型定義中聲明order方法:CREATEorreplaceTYPEaddress_typeASOBJECT(city VARCHAR2(10),streetVARCHAR2(10),zip NUMBER(6),ORDERMEMBERFUNCTIONaddress_order(other_addressaddress_type)RETURNINTEGER);........ORDER方法例1在類型定義中聲明order方法:...在類型體中實(shí)現(xiàn)方法:CREATEORREPLACETYPEBODYaddress_typeASORDERMEMBERFUNCTIONaddress_order(other_addressaddress_type)RETURNINTEGERISBEGIN IFself.zip<other_address.zipTHENRETURN1; ELSIFself.zip>other_address.zipTHENRETURN-1; ELSERETURN0; ENDIF;END;END;ORDER

方法例1郵編數(shù)小的地址大........在類型體中實(shí)現(xiàn)方法:ORDER方法例1郵編數(shù)小的地址大.ORDER

方法例1排序:.first_name

姓,

.last_name名,

c.address.city城市,c.address.zip郵編fromcustcorderbyc.addressdesc;排序結(jié)果:姓名城市郵編------------------------------------------------王至遠(yuǎn)北京100084趙力平上海200092張大民天津300072........ORDER方法例1排序:...ORDER

方法例2CREATEORREPLACE

TYPEemployee_typeASOBJECT(

empno NUMBER(3),ename VARCHAR2(10),salNUMBER(6.2),hiredateDATE,MEMBERFUNCTIONdays_at_companyRETURNNUMBER,MEMBERPROCEDUREraise_salary(increment_salNUMBER),PRAGMARESTRICT_REFERENCES(days_at_company,WNDS,WNPS),ORDERMEMBERFUNCTIONemp_order(other_empemployee_type)RETURNINTEGER);........ORDER方法例2CREATEORREPLACETYORDER

方法例2CREATEORREPLACETYPEBODYemployee_typeASMEMBERFUNCTIONdays_at_companyRETURNNUMBERIS BEGIN RETURNfloor(sysdate-hiredate); END;MEMBERPROCEDUREraise_salary(increment_salNUMBER)IS BEGIN UPDATEemployeesSETsal=sal+increment_salWHEREempno=SELF.empno; END;........ORDER方法例2CREATEORREPLACETORDER

方法例2ORDERMEMBERFUNCTIONemp_order(other_empemployee_type)RETURNINTEGERISBEGINRETURNFLOOR(-(SELF.hiredate-other_emp.hiredate));END;END;

/........ORDER方法例2ORDERMEMBERFUNCTIOORDER

方法例2select*fromemployeeseorderbyvalue(e);--按對象大小排序

EMPNOENAMESALHIREDATE------------------------------------------------3king90025-12月-002smith70010-5月-971Jone150005-10月-89........ORDER方法例2select*...對象類型維護(hù)ALTERTYPEemployee_type

REPLACEASOBJECT(empno NUMBER,ename VARCHAR2(10),salNUMBER,hiredateDATE,MEMBERFUNCTIONdays_at_companyRETURNNUMBER,MEMBERPROCEDUREraise_salary(increment_salNUMBER),PRAGMARESTRICT_REFERENCES(days_at_company,wnds,wnps),

........對象類型維護(hù)ALTERTYPEemployee_ty對象類型維護(hù)ORDERMEMBERFUNCTIONemp_order(other_empemployee_type)RETURNINTEGER,MEMBERFUNCTIONmonth_at_company--新方法RETURNNUMBER,PRAGMARESTRICT_REFERENCES(month_at_company,wnds));/........對象類型維護(hù)ORDERMEMBERFUNCTIONem對象類型維護(hù)CREATEORREPLACETYPEBODYemployee_typeASMEMBERFUNCTIONdays_at_companyRETURNNUMBERISBEGINRETURNfloor(sysdate-hiredate);END;MEMBERPROCEDUREra

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論