




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Oracle8對象關系數據庫1........Oracle8對象關系數據庫1...1高端數據庫-提高DBMS管理上限Oracle8對象關系數據庫擴充的類型系統對象關系數據庫Oracle8數據庫系統
........高端數據庫-提高DBMS管理上限Oracle8數據庫系統
一、高端數據庫-提高DBMS管理上限
oracle7 oracle8
數據庫大小 32TB 512KTB 數據文件個數 1-4K 64-256M每表包含列 數 254 1000 每表的LOB列數 1long 1000 CHAR長度 254 2000VARCHAR長度 2000 4000索引列數 16 32 ........一、高端數據庫-提高DBMS管理上限 oracl支持上萬個并發用戶多線程服務器(用少量的服務器端進程管理大量的客戶端用戶。Net8(SQL*net)連接管理器—連接池(TNS資源)、多路傳輸、應用請求集中化更有效地使用網絡資源避免操作系統對服務器網絡連接數的限制客戶端(服務器)服務器一、高端數據庫-提高DBMS管理上限網絡層透明網絡底層協議適配器........支持上萬個并發用戶一、高端數據庫-提高DBMS管理上限網絡層二、擴充的類型系統
-對象關系數據庫
關系模型與對象模型新的數據類型-對象(記錄)類型對象表—面向對象數據庫設計收集類型(數組與嵌套表)
對象與視圖
........二、擴充的類型系統
-對象關系數據庫..數據庫新的應用領域計算機輔助設計
CAD數據庫必須存儲和處理與工程設計相關的數據(產品部件及相互關系、設計版本…)計算機輔助軟件工程數據庫中存儲軟件開發人員用到的各種數據,包括源代碼、模塊之間依賴關系、變量定義、文檔…多媒體數據庫聲音、視頻、圖象…辦公信息系統超文本數據庫........數據庫新的應用領域計算機輔助設計...應用需要新的數據類型——論文檢索系統論文標題作者列表(第一作者,第二作者,找出某人參與撰寫的所有論文…)檢索關鍵字發表日期(年月日分開)........應用需要新的數據類型——論文檢索系統.傳統關系數據庫的數據類型復雜屬性只能拆分成并列的單一屬性姓名,地址(省、市、區、街道、門牌號)本來是一個結合緊密的整體,在關系數據庫中卻只能拆成單一屬性,與其他屬性并列(如姓名、年齡等),沒有反映出它們的緊密關系。無法表示變長的屬性家庭記錄有幾個孩子長字段設幾個字段(不好估計)家庭編號戶主子女1子女2子女3…........傳統關系數據庫的數據類型復雜屬性只能拆分成并列的單一屬性家庭傳統關系數據庫的數據類型無法直接表示嵌套表例:一張發貨單,發三種貨物:放3條記錄,但公共信息存3遍(查詢方便)拆成兩張表(發貨單,發送貨物),需要連接,費時,且要清楚表與表的關系貨單號發貨人貨物日期…發往地貨物名稱價格數量........傳統關系數據庫的數據類型無法直接表示嵌套表貨單號發貨人貨物日關系數據庫的數據模型數據模型是模型化數據和信息的工具。現實世界認識抽象信息世界-概念數據模型機器世界-DBMS支持的數據模型關系模型轉換........關系數據庫的數據模型數據模型是模型化數據和信息的工具。現實世數據模型演變文件系統(OS)層次模型——網狀模型——關系模型(DB)特點:面向記錄,信息由定長記錄組成。記錄簡單(短小)。原子字段,字段不再含有結構。........數據模型演變文件系統(OS)...關系模型的特點強調數據的獨立性(以數據為中心),數據與程序分離。采用關系模型、概念單一,實體和聯系都是用關系來表示。關系必須是規范化的關系,要求每一分量不可再分。支持關系語言,具有高度非過程化,支持集合運算通過外來碼實現表的連接(多表查詢)........關系模型的特點強調數據的獨立性(以數據為中心),數據與程序分Oracle8—擴充的類型系統是對關系數據模型進行的擴充。提供更為豐富的面向對象的類型系統。擴充的類型系統允許元組的屬性值為復雜類型,在關系查詢語言中增加處理新數據類型的成分。既保留關系模型基礎又提高建模能力對象關系模型為希望使用面向對象特征的關系數據庫用戶提供可能。........Oracle8—擴充的類型系統是對關系數據模型進行的擴充。面向對象的基本概念面向對象方法是以要解決的問題中所涉及到的各種對象為主要考慮因素。對象是一種看問題的觀點,是對現實世界各種元素的一種抽象。對象既含數據又含功能,因此具有自身處理數據的能力。對象被認為是迄今為止最接近真實事物的數據抽象。現實世界中對象有兩個共同的特點:一方面,它們都有自己的狀態。如一臺電視機有自己的擺放位置,有關機和開機狀態,此刻正在播放某一頻道的電視節目等另一方面,它們又都有自己的行為,如電視機的開機、關機、調臺等。........面向對象的基本概念面向對象方法是以要解決的問題中所涉及到的各面向對象的基本概念
內部實現(封裝)接口屬性、方法能動的主體使電腦貼近人腦的思維模式(減少人認識問題時的認識空間和計算機處理問題時的方法空間的不一致性)。實現軟件的復用(軟件芯片)。........面向對象的基本概念內部實現接口能動的主體使電腦貼近人腦的思對象的屬性與方法面向對象程序設計中的對象是現實世界對象的模型化,它同樣具有狀態和行為。對象的狀態用屬性來維護,對象的行為用方法來實現。因此可以簡單地講,對象是面向對象的程序設計模式,它由描述對象狀態的屬性(變量)和用來實現對象行為的方法(代碼)組成。........對象的屬性與方法面向對象程序設計中的對象是現實世界對象的模型對象與類相關對象的集合稱為
類(Class)類是對象的抽象及描述,它是具有統一屬性和方法的多個對象的統一描述體,是用來定義一組對象共有屬性和方法的模板。類是用來創建對象實例的樣板,它包含所創建對象的狀態描述和方法的定義。類是一個型,而對象則是這個型的一個實例。類是靜態概念,而對象則是一個動態概念,因為只有在運行時才給對象分配空間,對象才真正存在。........對象與類相關對象的集合稱為類(Class)...面向對象的數據模型在一些應用中,用戶將數據庫中的數據看作是一組對象而非一組記錄。面向對象的數據模型是面向對象程序設計思想在數據庫系統中的應用。基本思想—將數據和操作這些數據的程序代碼封裝在一個對象里。將一個對象存儲在數據庫中:對象的數據部分必須針對各個對象分別存儲。而實現類方法的程序代碼應該和類的定義一起作為數據庫模式的一部分存儲。........面向對象的數據模型在一些應用中,用戶將數據庫中的數據看作是一面向對象數據庫數據庫中不是只存儲單純的數據,而是存儲包含屬性和方法的對象。對于一個數據庫對象,可定義在其上運行的過程和函數。使數據庫中的數據和訪問該數據的方法聯系起來,可標準化數據訪問的方法并提高對象的可復用性。應用邏輯從應用程序中移動到數據庫中(對象方法)創建通用的數據庫對象,并能成為數據庫對象的標準,可實現數據庫對象的重用。........面向對象數據庫數據庫中不是只存儲單純的數據,而是存儲包含屬性數據模型現實世界認識抽象信息世界-概念數據模型機器世界-DBMS支持的數據模型對象模型轉換........數據模型現實世界認識信息世界-概念數據模型機器世界-轉換.對象模型與關系模型對象模型對象類型的屬性描述對象類型的方法封裝了操作該對象的代碼。提供了處理數據庫中數據的界面。關系模型二維表中列的定義沒有方法另編程可使用操作某數據庫表的存儲過程。面向對象數據模型中的類概念—實體集概念。面向對象數據模型中的對象概念—實體概念........對象模型與關系模型對象模型關系模型面向對象數據模型中的類概念對象模型與關系模型關系模型可用二維表來表示——關系表:屬性—二維表的列元組—二維表的行對象模型可用二維表來表示——對象表:用一個類(對象類型)定義一個對象表類的屬性—二維表的列對象(類的實例)—二維表的行(行對象)通過對象調用對象方法。........對象模型與關系模型關系模型可用二維表來表示——關系表:Oracle的擴充類型Oracle是一個開放的類型系統,增加了復雜的數據類型以及用戶自定義類型用戶定義的數據類型使得可以在數據庫中為現實世界的對象建模對象類型(記錄類型)數組類型嵌套表類型創建對象表,實現面向對象的數據庫設計(而非關系型數據庫設計。應用邏輯從應用程序中移動到數據庫中(對象方法)........Oracle的擴充類型Oracle是一個開放的類型系統,增加擴充類型的不同應用對象類型數組類型嵌套表類型
關系表對象表對象類型........擴充類型的不同應用對象類型數組類型嵌套表類型利用對象類型
定義復合數據類型25........利用對象類型
定義復合數據類型25...25用戶自定義數據類型使用對象類型定義一個記錄數據類型
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);........用戶自定義數據類型使用對象類型定義一個記錄數據類型...對象類型數據的操作
使用對象類型聲明了關系表中的列,DML語句必須用一些特殊的語法插入新記錄時,對于對象類型的列,要使用構造函數構造出對應類型的數據。構造函數是對象類型的特殊方法,利用此方法為該類型創建對象。構造方法的名稱與對象類型(類)同名。對記錄型數據的分量進行操作時,要使用“別名”........對象類型數據的操作使用對象類型聲明了關系表中的列,DML語對象類型數據的操作插入語句例:insertintoworkervalues(1,name_type('王','至遠'),
address_type('北京','白頤路5號',100084));insertintoworkervalues(2,name_type(‘張’,‘大年'),
address_type(‘天津’,‘康寧里20號’,300072));insertintoworkervalues(3,name_type('趙','力平'),
address_type('上海','南京路23號',200092));........對象類型數據的操作插入語句例:...對象類型數據的查詢查詢語句1select*fromworker;
WIDNAME(FIRST_NAME,LAST_NAME)ADDRESS(CITY,STREET,ZIP)-----------------------------------------------------------------------------------------------------
1NAME_TYPE(‘王’,‘至遠’)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(‘王’,‘至遠’)2NAME_TYPE(‘張’,‘大年’)3NAME_TYPE(‘趙’,‘力平’)........對象類型數據的查詢查詢語句1...對象類型數據的查詢查詢語句3(用別名)selectwid顧客編號,w.address.city城市,
w.address.street街道,w.address.zip郵編fromworkerw;顧客編號城市街道郵編-------------------------------------------------1北京白頤路5號1000842天津康寧里20號3000723上海南京路23號200092查詢語句4(別名的使用)select*fromworkerworderbyw.address.zip........對象類型數據的查詢查詢語句3(用別名)...對象類型數據的操作修改updateworkerwsetw.address.zip=100083wherewid=1;刪除deletefromworkerwherewid=1;.first_name=‘王’;修改表結構altertablecustadd(address1address_type);不能對表修改自定義的數據類型格式........對象類型數據的操作修改...用戶自定義數據類型對象類型更加貼近現實世界的數據特征。使用對象類型可以更加統一、自然地聲明和操作表中的數據(在整個數據庫中地址一致性)創建可為大家引用的新數據類型:創建一個模式(如pub)建立公共對象類型(新數據類型)設置必要的權限使用CREATEPROCEDUREnew_worker(
widNUMBER,_type,
addresspub.address_type)........用戶自定義數據類型對象類型更加貼近現實世界的數據特征。..自定義數據類型上的索引createindexaaaonworker(wname);ORA-02327:無法在具有數據類型ADT的列上創建索引。(即使在name_type類中定義了排序方法也不可以)如經常進行如下查詢:selectwid顧客編號,w.address.city城市,
w.address.street街道,w.address.zip郵編fromworkerwwherew.address.zip=100084;可建索引如下:createindexI_ziponworker(address.zip);........自定義數據類型上的索引createindexaaaon使用對象表
—面向對象數據庫設計34........使用對象表
—面向對象數據庫設計34...34建立對象表的類建類型(對象類型聲明)createtype類型名asobject(
屬性名1類型說明,屬性名2類型說明,…...
memberfunction函數名(參數說明)
return返回類型,
memberprocedure過程名(參數說明),…);方法說明屬性說明........建立對象表的類建類型(對象類型聲明)方法說明屬性說明對象屬性類型對象類型必須包含一個或多個屬性,屬性的類型可以是:Oracle的原始數據類型、LOB對象對象的引用(REF)收集(COLLECTION)等........對象屬性類型對象類型必須包含一個或多個屬性,屬性的類型可以是對象方法方法是一個過程或函數,是對象類型定義的一部分,是程序員編寫的用于操縱對象屬性的子程序,被封裝在對象類型中。方法的種類:成員方法(member)構造方法(constructor)MAP或ORDER方法(排序方法)一個類可以有多個方法(也可以不定義方法)對象類型不存儲數據;必須創建相應的表來存儲數據........對象方法方法是一個過程或函數,是對象類型定義的一部分,是程編寫方法代碼建類型體(實現類成員方法)createtypebody類型名ASmemberfunction函數方法名(參數說明)
return返回類型is
說明部分begin
執行部分end;memberprocedure過程方法名(參數說明)is
說明部分begin
執行部分end;END;方法實現方法實現........編寫方法代碼建類型體(實現類成員方法)方法實現方法實現..建立對象表建對象表
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_創建對象表CREATETABLEemployeesOFemployee_type(PRIMARYKEY(empno),UNIQUE(ename),CHECK(sal>300));........創建對象表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對方法的限制編譯軟件包中的函數或過程時,可以使用PRAGMA編譯指令通知PL/SQL編譯器禁止某方法對數據庫表和包中的變量讀寫,當方法體中出現違反情況時,編譯出錯。格式:
PRAGMARESTRICT_REFERENCES(function_name,WNDS[,WNPS][,RNDS][,RNPS]);WNDS不允許寫數據庫
RNDS不允許讀數據庫
WNPS不允許改程序包變量
RNPS不允許引用程序包變量........對方法的限制編譯軟件包中的函數或過程時,可以使用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'違反了它的相關編譯指令........對方法的限制CREATEORREPLACETYPE對象類型--構造子方法Oracle自動地為每個對象類型創建一個構造方法。構造子方法的名稱采用對象類型名。構造子方法的參數即對象類型的所有屬性。構造子方法初始化一個對象類型的實例,并將它的屬性賦值。例:insertintoemployeesvalues(employee_type(1,‘Jone’,500,‘5-10月-1989’));........對象類型--構造子方法Oracle自動地為每個對象類型創建對象表操作建表
createtableemployeesofemployee_type;插入數據insertintoemployeesvalues(employee_type(1,‘Jone’,500,‘5-10月-1989’));insertintoemployees--省略構造方法values(1,‘Jone’,1500,‘5-10月-1989’);insertintoemployeesvalues(2,'smith',700,‘10-5月-1997');insertintoemployeesvalues(3,‘king’,900,’25-12月-2000’);........對象表操作建表....獲取行對象—value函數value(對象表別名)返回一個行對象(對象類型)value用于從對象表中取得對象實例。
不使用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函數value(對象表別名)返回一個行對象表方法調用selectename,hiredatefromemployeeswhereempno=1;EMPNAMEHIREDATE--------------------------------------------Jone05-10月-89selectename,e.days_at_company()daysfromemployeesewhereempno=3;EMPNAMEDAYS-----------------------------------------------------------------------------------------------------------------king45使用別名........對象表方法調用selectename,hiredate在PL/SQL程序中,取得的對象實例必須被相同類型的對象變量接收。例:declareempemployee_type;beginselectvalue(e)intoempfromemployeesewhereempno=1;emp.raise_salary(500);end;/PL/SQL中對象方法的調用........在PL/SQL程序中,取得的對象實例必須被相同類型的對象變量PL/SQL中對象方法的調用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中對象方法的調用DECLARE...附:PL/SQL輸出與環境設置執行結果:Daysemployed:26PL/SQL輸出(利用包過程)dbms_output.put_line(‘…’);環境設置
execdbms_output.enable
setserveroutputon........附:PL/SQL輸出與環境設置執行結果:...對象方法小結對象類型總是有1到多個方法(構造方法是隱含方法,成員方法為0~n個。成員方法可以帶輸入輸出參數。每個成員方法含有名為SELF的隱含第一參數,它具有與對象類型自身相同的類型。定義函數方法,如沒參數不用寫括號,但調用時要寫括號。定義方法形參時,類型不用寫長度,如varchar2........對象方法小結對象類型總是有1到多個方法(構造方法是隱含方法,對象表的特性對象表是只用對象類型定義的數據庫表,不含關系型列。對象表的列對應(用來創建表的)對象類型的屬性。對象表的行是表類型的對象(實例),每一行都有一個系統分配的唯一的對象標識符(OID)對象ID(OID)是每一個行對象的唯一描述符,是全局唯一的,并且可以引用OID不用于定位數據,ROWID仍用于定位數據oracle通過對象引用實現數據庫中不同對象之間的聯系(與關系表完全不同)........對象表的特性對象表是只用對象類型定義的數據庫表,不含關系型列獲取對象引用—ref
函數具有OID的對象實例可以被引用(REF)ref(對象表的別名)返回對象表實例指針,即行對象的引用。例:selectref(e)fromemployeese;
REF(e)------------------------------------------------------------------------------------------------------------------------------------------------------------------000028020965D...0BEFE0340800209ADC5901403BE50000000028020965D...0BEFE0340800209ADC5901403BE50001000028020965D...0BEFE0340800209ADC5901403BE50002........獲取對象引用—ref函數具有OID的對象實例可以被引用(R對象引用例建立對象表custCreatetypecust_typeasobject(custid number(5),name name_type,address address_type);
createtablecustofcust_type(custidprimarykey);........對象引用例建立對象表cust...對象引用例向cust表中插入數據insertintocustvalues(1,name_type('王','至遠'),
address_type(‘北京’,‘白頤路5號’,100084));insertintocustvalues(2,name_type(‘張’,‘大年'),
address_type('天津','康寧里20號',300072));insertintocustvalues(3,name_type('趙','力平'),
address_type('上海','南京路23號',200092));........對象引用例向cust表中插入數據...對象引用例查詢cust表select*fromcustwherecustid=1;selectc.address.city,.first_name=‘王’;修改cust表結構???altertablecustadd(address1address_type);不允許!!!........對象引用例查詢cust表...對象引用例建立goods_typeCREATETYPEgoods_typeASOBJECT(gnoNUMBER(3),gnamevarchar2(20),pricenumber(6,2));/CREATETABLEgoodsOFgoods_type(constraintp1primarykey(gno));INSERTINTOgoodsVALUES(101,'電視機',2900);INSERTINTOgoodsVALUES(102,'洗衣機',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是指向行對象的指針,易于實現表和表之間的聯系,對象之間連接不再需要關系表的連接(JOIN)操作。將對象表的表別名作為REF的參數,可以取得對應OID的引用值。引用只能用于具有OID的對象。customer REF cust_typeSCOPEISCUSTSCOPE子句用于限定一個引用在一個指定表中,這樣可以提高查詢性能,并減少存儲指針的空間。........對象表—對象引用REF是指向行對象的指針,易于實現表和表之間INSERTINTOordersSELECT1,ref(c),‘7-1月-2000’,165,101
FROMcustc WHEREcustid=1;UPDATEorders SETcustomer=(SELECTREF(c)FROMcustc WHEREcustid=2) WHEREorderid=1;引用類型數據的操作........INSERTINTOorders引用類型數據的操作.引用類型數據的操作SELECTcustomerFROMordersWHEREorderid=1;22020865F009D0AC262…42A35E0340800…SELECTo.customer.custid顧客號,
.last_name名,orderdate日期FROMordersoWHEREorderid=1
顧客號名日期---------------------------
2
大年07-1月-00........引用類型數據的操作SELECTcustomer...對象引用—簡化了代碼數據庫管理對象間的連系,用戶只需通過屬性進行對象的引用。在關系設計中,開發人員必須使用聯接(JOIN)SELECTname,address,...FROMorderso,custcWHEREo.custid=c.custidandorderid=1;........對象引用—簡化了代碼數據庫管理對象間的連系,用戶只需通過屬性deref函數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函數deref(ref指針)返回指針指向的對象本SQL語句中的排序和比較傳統的數據類型主要為標量數據類型:
number,char,date標量數據類型可以排序(如orderby…)排序在SQL語句的使用:關系運算(><=)between及in的判斷orderbygroupbydistinct子句unique和primarykey約束
自定義數據類型如何排序selectwname,
addressfromworkerorderbyaddress;錯誤位于第2行:ORA-22950:無法ORDER沒有MAP或ORDER方法的對象........SQL語句中的排序和比較傳統的數據類型主要為標量數據類型:對象類型的排序方法同類的排序對支持用戶定義的對象類型很重要。對象類型由于結構復雜,必須借助方法實現排序和比較。MAP方法將對象類型轉換為傳統數據類型。ORDER方法提供排序規則。比較本對象和另一對象實例,并返回1,0,-1分別代表大于、等于、小于。一個對象類型只能有一個MAP方法或一個ORDER方法:mapmemberfunction…ordermemberfunction…........對象類型的排序方法同類的排序對支持用戶定義的對象類型很重要。MAP方法例對象類型---->標量類型方法返回一個傳統數據類型用于排序。沒有輸入參數(只有一個隱含參數SELF)。方法被隱含調用。在類型定義中說明MAP方法:CREATETYPEname_typeASOBJECT( first_namevarchar2(4), last_namevarchar2(4),MAPMEMBERFUNCTIONname_map RETURNvarchar2);........MAP方法例對象類型---->標量類型...在類型體中實現MAP方法:CREATETYPEBODYname_typeASMAPMEMBERFUNCTIONname_mapRETURNvarchar2ISBEGIN
RETURNfirst_name||last_name;END;END;排序:SELECTcustid,c.address.cityFROMcustcORDERBYnamedesc;任何基于name_type類型的排序按名稱的拼接串作為大小比較的依據。MAP方法例MAP方法隱含調用........在類型體中實現MAP方法:任何基于name_type類型的排ORDER
方法決定類型實例的序列關系。有一個參數(外加一個隱含的參數SELF)函數方法返回一個整數如果對象自身比參數對象小,返回-1如果對象自身與參數對象相等,返回0如果對象自身比參數對象大,返回1........ORDER方法決定類型實例的序列關系。...ORDER
方法例1在類型定義中聲明order方法:CREATEorreplaceTYPEaddress_typeASOBJECT(city VARCHAR2(10),streetVARCHAR2(10),zip NUMBER(6),ORDERMEMBERFUNCTIONaddress_order(other_addressaddress_type)RETURNINTEGER);........ORDER方法例1在類型定義中聲明order方法:...在類型體中實現方法:CREATEORREPLACETYPEBODYaddress_typeASORDERMEMBERFUNCTIONaddress_order(other_addressaddress_type)RETURNINTEGERISBEGIN IFself.zip<other_address.zipTHENRETURN1; ELSIFself.zip>other_address.zipTHENRETURN-1; ELSERETURN0; ENDIF;END;END;ORDER
方法例1郵編數小的地址大........在類型體中實現方法:ORDER方法例1郵編數小的地址大.ORDER
方法例1排序:.first_name
姓,
.last_name名,
c.address.city城市,c.address.zip郵編fromcustcorderbyc.addressdesc;排序結果:姓名城市郵編------------------------------------------------王至遠北京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*...對象類型維護ALTERTYPEemployee_type
REPLACEASOBJECT(empno NUMBER,ename VARCHAR2(10),salNUMBER,hiredateDATE,MEMBERFUNCTIONdays_at_companyRETURNNUMBER,MEMBERPROCEDUREraise_salary(increment_salNUMBER),PRAGMARESTRICT_REFERENCES(days_at_company,wnds,wnps),
........對象類型維護ALTERTYPEemployee_ty對象類型維護ORDERMEMBERFUNCTIONemp_order(other_empemployee_type)RETURNINTEGER,MEMBERFUNCTIONmonth_at_company--新方法RETURNNUMBER,PRAGMARESTRICT_REFERENCES(month_at_company,wnds));/........對象類型維護ORDERMEMBERFUNCTIONem對象類型維護CREATEORREPLACETYPEBODYemployee_typeASMEMBERFUNCTIONdays_at_companyRETURNNUMBERISBEGINRETURNfloor(sysdate-hiredate);END;MEMBERPROCEDUREra
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業應用中基于區塊的復雜產品制造鏈的透明化實踐
- 從傳統到未來DeFi和NFT在醫療保健中的應用前景
- 從基礎到專業醫療用熱熔膠在科技產品中的應用
- 以健康碼為切入點探索數據安全的現狀及未來發展方向
- 企業如何應對醫療器械注冊的法規變化
- 企業醫學科研團隊建設中的誠信培育
- 臥式刮刀卸料離心機企業數字化轉型與智慧升級戰略研究報告
- 脈沖編碼調制設備零件企業數字化轉型與智慧升級戰略研究報告
- 真空減壓濃縮罐企業ESG實踐與創新戰略研究報告
- 絞鋼機械企業縣域市場拓展與下沉戰略研究報告
- 湖北省武漢市2025屆高中畢業生四月調研考試數學試卷及答案(武漢四調)
- 創新創業實戰學習通超星期末考試答案章節答案2024年
- GB 21258-2024燃煤發電機組單位產品能源消耗限額
- DB34∕T 4010-2021 水利工程外觀質量評定規程
- 醫療美容診所規章制度上墻
- 人教鄂教版五年級科學下期中測試卷(1-9課)(含答案)
- 全國高中語文優質課一等獎《雷雨》 課件
- 醫療機構雙向轉診登記表
- 蔬菜水果報價單表
- 第4章液態金屬凝固的熱力學和動力學
- 熱軋板帶2150課程設計
評論
0/150
提交評論