《應(yīng)用程序結(jié)構(gòu)》PPT課件.ppt
《《應(yīng)用程序結(jié)構(gòu)》PPT課件.ppt》由會員分享,可在線閱讀,更多相關(guān)《《應(yīng)用程序結(jié)構(gòu)》PPT課件.ppt(82頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、1,Oracle 數(shù)據(jù)庫系統(tǒng)第12章 應(yīng)用程序結(jié)構(gòu),2,本章要點,理解子程序(過程、函數(shù))及包的概念 掌握如何創(chuàng)建、執(zhí)行和刪除過程、函數(shù)及包的方法 靈活使用過程、函數(shù)及包書寫PL/SQL程序 掌握創(chuàng)建和測試DML觸發(fā)器、instead-of數(shù)據(jù)庫觸發(fā)器以及系統(tǒng)觸發(fā)器 了解數(shù)據(jù)庫觸發(fā)器的使用時機和限制,3,子程序,子程序: PL/SQL的過程和函數(shù)統(tǒng)稱為子程序 匿名塊: 以DECLARE或BEGIN開始,每次提交都被編譯。匿名塊不在數(shù)據(jù)庫中存儲并且不能直接從其他PL/SQL塊中調(diào)用。 命名塊:除匿名塊之外的其他塊。包括過程,函數(shù),包和觸發(fā)器。可以在數(shù)據(jù)庫中存儲并在適當(dāng)?shù)臅r候運行。,4,子程序的優(yōu)
2、點,具有可擴展性 可以自定義 PL/SQL 語言以滿足應(yīng)用程序的需要 提高可復(fù)用性和可維護性 子程序只要有效,就完全可以用于任何數(shù)目的應(yīng)用程序中 簡化了維護/優(yōu)化過程,因為如果定義更改只有子程序受到影響,5,創(chuàng)建子程序,創(chuàng)建過程(語法如下),CREATE OR REPLACE PROCEDURE procedure_name (argumentIN|OUT|IN OUTtype, ... argument IN| OUT| IN OUT type) IS| AS procedure_body,6,創(chuàng)建過程,過程的結(jié)構(gòu)應(yīng)具有下面所示的特征:,CREATE OR REPLACE PROCEDURE
3、 procedure_name parameter_list AS /*Declarative section is here*/ BEGIN /*Executable section is here*/ EXCEPTION /*Exception section is here*/ END procedure_name;,7,創(chuàng)建過程,CREATE OR REPLACE PROCEDURE search_emp (p_empno IN NUMBER,p_ename OUT VARCHAR2(20), p_deptno OUT NUMBER) IS v_name VARCHAR2(20); v
4、_deptno NUMBER; BEGIN SELECT ENAME,DEPTNO INTO v_name, v_deptno FROM EMP WHERE EMPNO= p_empno; p_ename := v_name ; p_deptno := v _deptno ; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(EMPNO:|| p_empno||NO EXIST ); END search_emp;,8,創(chuàng)建函數(shù),函數(shù)與過程的比較: 兩者都帶有參數(shù),參數(shù)可以具有模式。 兩者都是PL/SQL語句塊的不同形式,都有聲明段、可執(zhí)行段以及
5、異常段。 兩者都可以存儲在數(shù)據(jù)庫中或在語句塊中聲明 兩者不同的是,過程調(diào)用本身是一個PL/SQL語句,而函數(shù)調(diào)用是作為表達(dá)式的一部分被調(diào)用的。,9,函數(shù)的語法,非常類似于創(chuàng)建過程的語法。其定義如下:,CREATE OR REPLACE FUNCTION function_name ( argumentIN | OUT | IN OUT type, ... argumentIN | OUT | IN OUT type) RETURN return_typeIS | AS function_body,10,RETURN語句,RETURN語句用來把控制返回到調(diào)用環(huán)境中。,語法如下: RETURN e
6、xpression;,當(dāng)該語句執(zhí)行時,如果表達(dá)式的類型與定義不符,該表達(dá)式將被轉(zhuǎn)為函數(shù)定義子句RETURN中指定的類型,同時,控制將立即返回到調(diào)用環(huán)境。,11,刪除過程和函數(shù),刪除操作是將過程或函數(shù)從數(shù)據(jù)字典中刪除。,刪除過程的語法如下,刪除函數(shù)的語法如下:,DROP PROCEDURE procedure_name;,DROP FUNCTION function_name ;,12,子程序參數(shù),1、參數(shù)模式 2、在形參和實參之間傳遞數(shù)值 3、對形參的約束 4、子程序內(nèi)部引發(fā)的異常 5、按引用和按值傳遞參數(shù) 6、使用NOCOPY參數(shù) 7、不帶參數(shù)的子程序 8、定位符和命名符 9、參數(shù)缺省值,1
7、3,1、參數(shù)模式,過程和函數(shù)的參數(shù)可以有不同的模式,并可以按值或按引用進行傳遞。,14,DECLARE -- Variables describing the new employee v_NewEmpNo emp.empno%TYPE:=7968; v_NewName emp.ename%TYPE:=Cynthia; v_NewJob emp.job%TYPE:=Manager; v_Mgr emp.mgr%TYPE:=7839; v_HireDate emp.hiredate%TYPE:=20-SEP-03; v_Sal emp.sal%TYPE:=2010; v_Comm m%TYPE:
8、=NULL; v_DeptNo emp.deptno%TYPE:=40; BEGIN -- Add Cynthia to the database. HireNewEmployee(v_EmpNo,v_EName,v_Job,v_Mgr, v_HireDate,v_Sal,v_Comm,v_DeptNo); END;,舉例,15,參數(shù)模式,16,2、在形參和實參之間傳遞數(shù)值,文字或常數(shù)作為實參 因為復(fù)制功能的使用,對應(yīng)于參數(shù)IN OUT或OUT的實參必須是變量,而不能是常數(shù)或表達(dá)式。也就是說,程序必須提供返回的變量的存儲位置。 編譯檢查 PL/SQL編譯器在創(chuàng)建過程時將對合法的賦值進行檢查。
9、從OUT參數(shù)讀取數(shù)據(jù),17,3、對形參的約束,調(diào)用過程時,實參的值將被傳入該過程,這些實參在該過程內(nèi)部以引用的方式使用形參。 同時,作為參數(shù)傳遞機制一部分,對變量的約束也傳遞給該過程。 在過程的聲明中,強制指定參數(shù)CHAR和VARCHAR2的長度,以及指定NUMBER參數(shù)的精度或小數(shù)點后位數(shù)都是非法的,這是因為這些約束可以從實參中獲得。,18,錯誤聲明: CREATE OR REPLACE PROCEDURE ParameterLength( p_Parameter1 IN OUT VARCHAR2(10), p_Parameter2 IN OUT NUMBER(3,1)) AS BEGIN
10、p_Parameter1:=abcdefghijklm; p_Parameter2:=12.3; END ParameterLength;,舉例,正確聲明: CREATE OR REPLACE PROCEDURE ParameterLength( p_Parameter1 IN OUT VARCHAR2, p_Parameter2 IN OUT NUMBER) AS BEGIN p_Parameter1:=abcdefghijklmno; p_Parameter2:=12.3; END ParameterLength;,19,4、子程序內(nèi)部引發(fā)的異常,如果錯誤發(fā)生在子程序的內(nèi)部,就會引發(fā)異常。
11、 該異常既可以是由用戶定義的,也可以是程序中預(yù)定義的。 如果引發(fā)異常的過程中沒有處理該錯誤的異常處理程序(或該異常發(fā)生在該異常處理程序的內(nèi)部),根據(jù)異常的傳播規(guī)則,控制將立即轉(zhuǎn)出該過程返回其調(diào)用環(huán)境。然而,在這種情況下,OUT和IN OUT形參的值并沒有返回到實參。這些實參仍將被設(shè)置為調(diào)用前的值。,20,5、按引用和按值傳遞參數(shù),子程序參數(shù)可以按即按引用或按值傳遞。 按引用傳遞:一個指向?qū)崊⒌闹羔槍⒈粋鬟f到對應(yīng)的形參。 按值傳遞:實參的值將被賦予對應(yīng)的形參。,21,6、使用NOCOPY參數(shù),語法如下:,parameter_name mode NOCOPY datatype,parameter_
12、name是參數(shù)名 mode是參數(shù)的模式(IN,OU,IN OUT) datatype是參數(shù)的數(shù)據(jù)類型 如果使用了NOCOPY,則PL/SQL編譯器將按引用傳遞參數(shù),而不按值傳遞 由于NOCOPY是一個編譯選項,而非指令,所以該選項不總是被采用。,22,使用NOCOPY時的異常語義,當(dāng)參數(shù)通過引用傳遞時,任何對實參的修改也將引起對其對應(yīng)形參的修改,這是因為該實參和形參同時位于相同的存儲單元的緣故。換句話說,如果過程退出時沒有處理異常而形參已被修改的話,則該形參對應(yīng)的實參的原始值也將被修改。,23,使用NOCOPY的限制,在某些情況下,NOCOPY將被編譯器忽略,這時的參數(shù)仍將按值傳遞。在這種情況
13、下,編譯器不會報告編譯錯誤。由于NOCOPY是一個提示項(Hint),編譯器可以決定是否執(zhí)行該項。,24,使用NOCOPY的優(yōu)點,NOCOPY的主要優(yōu)點是可以提高程序的效率。當(dāng)我們傳遞大型PL/SQL表時,其優(yōu)越性特別顯著。 按值傳遞IN OUT模式的參數(shù)所使用的時間遠(yuǎn)遠(yuǎn)大于按引用傳遞IN和IN OUT NOCOPY參數(shù)所使用的時間。,25,7、不帶參數(shù)的子程序,如果過程沒有參數(shù)的話,就不需要在該過程調(diào)用聲明中或在其過程調(diào)用中使用括弧。函數(shù)也具有類似的情況。 函數(shù)與過程類似 。,26,8、定位符和命名符,實參都通過位置與對應(yīng)的形參相關(guān)聯(lián),參數(shù)間的這種對應(yīng)法稱為定位符(Positional No
14、tation)。 命名符中,對于每一個參數(shù),都包含了形參和實參。這就允許我們在需要時重新安排參數(shù)的順序。 定位符和命名符也可以在同一個調(diào)用中混合使用。但是,該類調(diào)用的第一個參數(shù)必須是通過位置指定,而其余的參數(shù)可以根據(jù)名稱指定。,27,定位符與命名符的對比,28,9、參數(shù)缺省值,過程或函數(shù)的形參可以具有缺省值。如果一個參數(shù)有缺省值的話,該參數(shù)就可以不從調(diào)用環(huán)境中傳遞。如果傳遞了一個值,則實參的值將取代缺省值。,parameter_name mode parameter_type:=|DEFAULT initial_value,29,過程與函數(shù)的比較,相同點: 通過設(shè)置OUT參數(shù),過程和函數(shù)都可以
15、返回一個以上的值。 過程和函數(shù)都可以具有聲明段、可執(zhí)行段和異常處理段。 過程和函數(shù)都可以接受缺省值。 都可以使用位置或名稱對應(yīng)法調(diào)用過程和函數(shù)。 過程和函數(shù)都可以接受參數(shù)NOCOPY(僅Oracle8i及更高版本支持)。,30,過程與函數(shù)的比較,區(qū)別: 如果返回值在一個以上時,用過程為好。 如果只有一個返回值,使用函數(shù)就可以滿足要求。 函數(shù)還可以從SQL語句中調(diào)用。,31,過程、函數(shù)練習(xí),1、創(chuàng)建一個過程,向DEPT插入一個新單位,通過兩個變量提供單位編號和單位名稱 2、創(chuàng)建一個過程,修改DEPT中的某一單位的單位名稱,過程應(yīng)包括異常處理。 3、創(chuàng)建一函數(shù),以確認(rèn)指定的DEPTNO是否存在,返
16、回BOOLEAN型值 4、創(chuàng)建一個過程,新增一員工,調(diào)用上題函數(shù)判斷DEPTNO的存在,如果不存在發(fā)出警告,員工各數(shù)據(jù)項均有默認(rèn)值。,32,包,包是由存儲在一起的相關(guān)對象組成的PL/SQL結(jié)構(gòu)。 包有兩個獨立的部分:說明和包體,這兩部分獨立地存儲在數(shù)據(jù)字典中。 包只能被存儲,而且不可能是局部的。,33,包的說明,語法:CREATE OR REPLACE PACKAGE package_nameIS|AS type_definition| procedure_specification| function_specification| variable_declaration| exceptio
17、n_declaration| cursor_declaration| pragma_declaration END package_name;,34,包的說明,包的說明:也叫做包頭,包含了有關(guān)包的內(nèi)容的信息。該部分中不包括任何子程序代碼。,35,包體,包體是一個獨立于包頭的數(shù)據(jù)字典對象。 包體只能在包頭完成編譯后才能進行編譯。 包體中包含包頭中預(yù)先聲明的子程序的代碼。 除此之外,包體還可以包括對包體是全局的其他聲明,但這些附加說明對于說明部分是不可見的。 包體是可選的。如果包頭中不包含任何過程或函數(shù)的話(只有變量聲明,游標(biāo),類型等),那么包體就不必存在。 包頭中的任何預(yù)先聲明不能出現(xiàn)在包體中。
18、包頭和包體中的過程和函數(shù)的說明必須一致,其中包括子程序名和其參數(shù)名,以及參數(shù)的模式。,36,包和作用域,包頭中聲明的任何對象都是在其作用域中,并且可在其外部使用包名作為前綴對其進行引用。 在包體內(nèi),包頭中的對象可以不帶包名進行直接引用。 在包體中可以包含私有聲明。這些定義的類型和數(shù)據(jù)項可以且只能在包體內(nèi)部使用。,37,重載封裝子程序,在包的內(nèi)部,過程和函數(shù)可以被重載。也就是說,可以有一個以上具有相同名稱但參數(shù)不同的過程或函數(shù)。 如果兩個子程序的參數(shù)僅在名稱和模式上不同,則這兩個過程不能重載。 不能只根據(jù)兩個過程的不同返回類型對其進行重載。 重載函數(shù)的參數(shù)的類型系列(type family)必須
19、不同,也就是說,不能對同一個類型系列的過程進行重載。,38,包的初始化,定義: 當(dāng)?shù)谝淮握{(diào)用封裝子程序時,或者對封裝變量或類型進行引用時,就對包進行了實例化。 在大多數(shù)情況下,在會話內(nèi)首次對一個包進行實例化操作時,要運行初始化代碼。,39,小結(jié),命名塊是已經(jīng)命名并保存的PL/SQL語句塊,程序中可以重復(fù)使用它們。存儲子程序是保存在數(shù)據(jù)庫中的命名塊。 PL/SQL有兩種類型子程序:過程和函數(shù)。子程序是一種可以執(zhí)行操作和接收參數(shù)的命名塊。 子程序的結(jié)構(gòu)是標(biāo)準(zhǔn)的PL/SQL結(jié)構(gòu),包括聲明段、可執(zhí)行段和異常處理段。 過程是一個PL/SQL語句,而函數(shù)是表達(dá)式的一部分。 函數(shù)使用一些參數(shù),并且必須返回一
20、個值。在聲明段包括了一個RETURN語句,指出返回值的數(shù)據(jù)類型,在可執(zhí)行段至少包括一個RETURN語句,但只會執(zhí)行其中一個。過程中的RETURN語句是不同的,它只是控制執(zhí)行語句的流程。 形參指的是子程序聲明段中的參數(shù)。實參是用來在調(diào)用子程序時向子程序傳遞值的變量。形參具有3種模式:IN、OUT和IN OUT。,40,小結(jié),子程序參數(shù)可以按兩種方式傳遞參數(shù)值:按引用或按值傳遞。當(dāng)參數(shù)是按引用傳遞時,一個指向?qū)崊⒌闹羔槍⒈粋鬟f到對應(yīng)的形參。當(dāng)參數(shù)是按值傳遞時,實參的值將被賦予對應(yīng)的形參。 將值傳遞到參數(shù)可以使用兩種方法:占位符和命名符。 包是由存儲在一起的相關(guān)對象組成的PL/SQL結(jié)構(gòu)。包有兩個獨
21、立的部分:說明和包體,這兩部分獨立地存儲在數(shù)據(jù)字典中。 在包的說明中聲明的對象是全局的,可以在包外引用它們。在包體聲明的所有元素都是局部的,只能在包體中引用它們,而不能在包外引用。 重載是包的一種特性,它允許創(chuàng)建多個具有相同名稱的子程序。這允許同一個子程序可以接受不同類型的參數(shù)。重載子程序的參數(shù)必須在參數(shù)數(shù)量、數(shù)據(jù)類型系列或者順序上有所不同。,41,局部子程序,局部子程序:是一個在PL/SQL語句塊的聲明段中聲明的子程序。 子函數(shù)只在其聲明的語句塊中可見,其作用域從聲明點開始到該語句塊結(jié)束為止。其他語句塊不能調(diào)用該函數(shù),因為該函數(shù)對其他語句塊來說是不可見的。,42,局部子程序(續(xù)),局部子程序
22、也可以聲明為存儲子程序聲明段的一部分 局部子程序的位置:任何局部子程序都必須在聲明段的最后進行聲明 預(yù)先聲明 :局部PL/SQL子程序的名稱是標(biāo)識符,必須在被引用前聲明。 局部子程序也可以重載,43,存儲子程序和局部子程序的比較,44,存儲子程序和包的注意事項,優(yōu)勢: 可以由多個數(shù)據(jù)庫用戶共享 隱含影響: 存儲子程序間的依賴性 包狀態(tài)的處理方法 運行存儲子程序 包所需要的特權(quán),45,子程序的依賴性,依賴:數(shù)據(jù)字典記錄了存儲過程或函數(shù)所引用的所有Oracle對象。該過程或函數(shù)就依賴于這些存儲的對象。 自動重編譯:如果一個依賴對象失效,PL/SQL引擎將在該對象再次被調(diào)用時對其重新進行編譯。 包的
23、依賴性:包體的變化不會導(dǎo)致修改包頭。因此,其他依賴于該包頭的對象也不需要進行重新編譯。如果該包頭有變化,則會使包體自動失效,這是因為該包體依賴于包頭 。 如何確定無效 :通過數(shù)據(jù)字典在不斷地跟蹤對象間依賴關(guān),46,包運行時狀態(tài),當(dāng)?shù)谝淮螌嵗粋€包時,將從磁盤中讀入該包的偽代碼并將其放入系統(tǒng)全局工作區(qū)SGA的共享池中。 包的運行時狀態(tài),即打包的變量和游標(biāo),則存放在用戶全局區(qū)(UGA)的會話存儲區(qū)中。這就保證了每個會話都將有其運行時狀態(tài)的副本。 可串行復(fù)用包和非串行復(fù)用包:PL/SQL 2.3版及更高版本允許程序員對包做可串行復(fù)用標(biāo)志。,47,包運行時狀態(tài),48,EXECUTE特權(quán),為了能夠?qū)Ρ?/p>
24、進行訪問,必須使用SELECT,INSERT,UPDATE和DELETE對象特權(quán)。GRANT語句把這些特權(quán)賦予數(shù)據(jù)庫用戶或角色。對于存儲子程序和包來說,相關(guān)的特權(quán)是EXECUTE。,49,50,51,存儲子程序和角色,子程序使用顯式地(而不是通過角色)授權(quán)其所有者的特權(quán)而執(zhí)行。 為了使通過角色授權(quán)的特權(quán)作用在存儲子程序和觸發(fā)器內(nèi)被使用,每次運行過程時,必須對該特權(quán)進行檢查。,52,調(diào)用者的權(quán)限與定義者的權(quán)限,Oracle8i提供了不同的外部引用解決方案。在調(diào)用者的權(quán)限子程序中,外部引用是通過調(diào)用者而不是所有者的特權(quán)設(shè)置而執(zhí)行的。調(diào)用者的權(quán)限程序是通過使用AUTHID子句而創(chuàng)建,該語句只適用于獨
25、立子程序、包說明和對象類型說明。 在包內(nèi)部或?qū)ο箢愋椭械莫毩⒆映绦虮仨毝际钦{(diào)用者子程序或都是定義者子程序,而不能混合。,53,AUTHID的語法如下: CREATE OR REPLACE FUNCTION function_name parameter_list RETURN return_type AUTHID CURRENT_USER | DEFINER IS | AS function_body; CREATE OR REPLACE PROCEDURE procedure_name parameter_list AUTHID CURRENT_USER | DEFINER IS | AS
26、function_body; CREATE OR REPLACE PACKAGE package_spec_name AUTHID CURRENT_USER | DEFINER IS | AS package_spec; CREATE OR REPLACE TYPE type_name AUTHID CURRENT_USER | DEFINER IS | AS OBJECT type_spec;,54,默認(rèn)參數(shù),從過程化語句中調(diào)用一個函數(shù)時,如果該函數(shù)有形參的話,可以使用其缺省值。然而,如果從SQL語句調(diào)用函數(shù)時,必須指定所有參數(shù)。 必須使用定位符(Positinal Notation),而不
27、能使用命名符(Name Notation)。,55,包的輔助功能,共享池鎖定 包體長度的限制 優(yōu)化參數(shù),56,共享池鎖定,DBMS_SHARED_POOL包允許程序員把一個對象鎖定在共享池中。 當(dāng)該對象被鎖定后,除非由程序申請對其清除,否則無論共享池有多滿,也不管是否有程序訪問該對象,該對象將常駐在共享池中。 這種處理方法有利于提高程序的運行效率,因為從系統(tǒng)的磁盤重新裝入對象要進行大量讀寫操作。鎖定對象還有助于最大限度地減少共享池的碎片。,57,包體長度的限制,編譯器對包體長度的限制如下 : Diana樹中的節(jié)點數(shù)。在Oracle8i之前的版本中,Diana節(jié)點的最大數(shù)目是32K,Oracle
28、8i以上版本將包體和類型體的限制擴充到了64兆字節(jié)的容量。 編譯器生成的臨時中間變量的容量最多21K字節(jié)。 入口點的數(shù)量。一個包體最多可以有32K個入口點,入口點可以是過程或函數(shù)。 字符串的數(shù)量。PL/SQL對字符串的限制單位是232。,58,觸發(fā)器,觸發(fā)器類似于函數(shù)和過程,它們都是具有聲明段、可執(zhí)行段和異常處理段的命名PL/SQL語句塊。像包一樣,觸發(fā)器必須在數(shù)據(jù)庫中存儲為獨立的對象。 主要用于: 維護那些通過創(chuàng)建表時的聲明約束無法實現(xiàn)的復(fù)雜的完整性約束。 通過記錄已進行的改變以及是誰進行了該項改變來檢查一個表中的信息。 當(dāng)一個表發(fā)生改變時,自動向其他程序發(fā)送需要采取行動的信號。 在一個發(fā)布
29、-預(yù)訂環(huán)境中發(fā)布有關(guān)各種事件的信息。,59,觸發(fā)器的類型,觸發(fā)器主要有三種類型: DML INSTEAD-OF觸發(fā)器 系統(tǒng)觸發(fā)器。,60,DML觸發(fā)器,DML觸發(fā)器可以由DML語句激發(fā) 由DML語句的類型決定DML觸發(fā)器的類型。 DML觸發(fā)器可以在DML語句操作之前或之后激發(fā)。 DML觸發(fā)器也可以在行或語句操作上激發(fā) 。,61,INSTEAD-OF觸發(fā)器,INSTEAD-OF 觸發(fā)器是行級別的,執(zhí)行時,激發(fā)它的DML語句不執(zhí)行。 只能定義在視圖上。 Oracle8及更高版本才提供。,62,系統(tǒng)觸發(fā)器,系統(tǒng)觸發(fā)器在發(fā)生諸如數(shù)據(jù)庫啟動或關(guān)閉等系統(tǒng)事件時激發(fā),而不是在執(zhí)行DML語句時激發(fā)。 系統(tǒng)觸發(fā)
30、器也可以在DDL操作時,如表的創(chuàng)建時被激發(fā)。,63,創(chuàng)建觸發(fā)器,CREATE OR REPLACE TRIGGER trigger_name BEFORE | AFTER | INSTEAD OF triggering_event referencing_clause WHEN trigger_condition FOR EACH ROW trigger_body;,,,,64,創(chuàng)建DML觸發(fā)器,65,DML觸發(fā)器例子,Create or replace trigger modi_emp before insert or update or delete on emp Begin if (to
31、_char(sysdate,HH24)not between 08and 17) or (to_char(sysdate,dy,nls_date_language=american) in (sat,sun)) then raise_application_error(-20000,費工作時間不能修改職工信息); end if; End;,66,DML觸發(fā)器激發(fā)順序,如果存在語句之前的觸發(fā)器,先執(zhí)行該觸發(fā)器。 對于受語句影響每一行: 如果存在行之前的觸發(fā)器,執(zhí)行該觸發(fā)器。 執(zhí)行該語句本身。 如果存在行之后的觸發(fā)器,執(zhí)行該觸發(fā)器。 如果存在語句之后的觸發(fā)器,運行該觸發(fā)器。,67,行級別觸發(fā)器的相
32、關(guān)標(biāo)識符,觸發(fā)語句處理每一行時,行級別觸發(fā)器都激發(fā)一次。 在觸發(fā)器內(nèi)部,可以通過相關(guān)標(biāo)識符:old和:new訪問正在處理中的行的數(shù)據(jù)。 標(biāo)識符:old和:new也被稱為偽記錄。,68,: old和:new相關(guān)標(biāo)識符,注意:old標(biāo)識符對INSERT語句未定義,而:new標(biāo)識符對DELETE語句未定義。PL/SQL編譯器不會對在INSERT語句中使用的:old和在DELETE語句中使用的:new標(biāo)識符報錯,編譯的結(jié)果將使這兩者的字段值為NULL。,69,觸發(fā)器例子,Create or replace trigger score_change after update of score on gr
33、ade For each row Begin insert into table_score_change values(:old.sno,:o,:old.score,:new.score,sysdate); End;,70,WHEN子句,WHEN子句只適用于行級別觸發(fā)器。 如果使用該子句,觸發(fā)器體將只對滿足由WHEN子句指定條件的行而執(zhí)行。,語法:WHEN trigger_condition,71,觸發(fā)器謂詞,72,創(chuàng)建instead-of觸發(fā)器,instead-of觸發(fā)器用于以下兩種情況: 允許修改一個本來無法修改的視圖。 修改視圖中嵌套表列的列。,73,可更改的與不可更改的視圖,可更改視
34、圖:可以發(fā)出DML命令的視圖。 一般來說,視圖如果不包括下列命令中的任何一項,它就是一個可更改視圖 。 1、集合操作符(UNION、UNION ALL、MINUS) 2、聚集函數(shù)(SUM、AVG等) 3、GROUP BY、CONNECT BY或START WITH子句 4、DISTINCT操作符 5、連接,74,instead-of觸發(fā)器,如果一個視圖是不可更改的,則可以在其上編寫一個instead-of觸發(fā)器來執(zhí)行正確的操作,從而使該視圖可更改。 如果需要進行其他處理的話,也可以在可更改視圖上編寫instead-of觸發(fā)器。,75,創(chuàng)建系統(tǒng)觸發(fā)器,系統(tǒng)觸發(fā)器可以在兩種不同種類的事件(即DDL
35、或數(shù)據(jù)庫)上激發(fā)。 DDL事件包括CREATE、ALTER或DROP語句。 而數(shù)據(jù)庫事件包括服務(wù)器的啟動或關(guān)閉,用戶的登錄或退出,以及服務(wù)器錯誤。,語法: CREATE OR REPLACE TRIGGER schema. trigger_name BEFORE | AFTER ddl_event_list| database_event_list ON DATABASE | schema.SCHEMA when_clause trigger_body;,76,系統(tǒng)DLL和數(shù)據(jù)庫事件,77,其他觸發(fā)器問題,觸發(fā)器名稱的命名空間(Name-space) 使用觸發(fā)器的各種限制和不同種類的觸發(fā)器體。
36、 與觸發(fā)器有關(guān)的權(quán)限問題,78,觸發(fā)器名稱,命名空間:是一組合法的可供對象作為名字使用的標(biāo)識符。過程、包和表都共享同一個命名空間,在一個數(shù)據(jù)庫模式范圍內(nèi),同一命名空間內(nèi)的所有的對象必須具有唯一的名稱。 觸發(fā)器隸屬于一個獨立的命名空間。也就是說,觸發(fā)器可以有與表和過程相同的名稱。然而,在一個模式范圍內(nèi),給定的名稱只能用于一個觸發(fā)器。,79,對觸發(fā)器的限制,觸發(fā)器不能發(fā)出任何事務(wù)控制語句,如COMMIT、ROLLBACK、SAVEPOINT或SET TRANSACTION。 由觸發(fā)器體調(diào)用的任何過程或函數(shù)都不能發(fā)出任何事務(wù)控制語句(除非在Oracle8i及更高版本中把它們聲明為自治的)。 觸發(fā)器體
37、不能聲明任何LONG或LONG RAW變量。而且,:new和:old也不能指向為之定義的表的LONG或LONG RAW類型的列。 在Oracle8及更高版本中,觸發(fā)器體中的代碼可以引用和使用LOB(大型對象)列,但不能修改該列的值。這個限制也適用于對象列。,80,觸發(fā)器權(quán)限,81,本章小結(jié),數(shù)據(jù)庫觸發(fā)器是根據(jù)一個事件執(zhí)行的PL/SQL語句塊。數(shù)據(jù)庫觸發(fā)器有三種類型:DML觸發(fā)器、instead-of觸發(fā)器和系統(tǒng)觸發(fā)器。 CREATE TRIGGER語句包括執(zhí)行時間選項(之前或之后),并且可以標(biāo)識為行級別和語句級別。 行級別觸發(fā)器對于DML事件影響的每一行激發(fā)。語句級別觸發(fā)器只對DML事件觸發(fā)一
38、次,而不管DML影響了多少行。 CREATE TRIGGER語句包括一個可選的WHEN子句,它可以檢查一個條件,決定是否應(yīng)該執(zhí)行觸發(fā)器。 相關(guān)性標(biāo)識符:OLD和:NEW允許引用DML操作的原始行值和新行值。 觸發(fā)器謂詞INSERTING、UPDATING和DELETING允許在一個觸發(fā)器中對于不同事件執(zhí)行不同的PL/SQL代碼。,82,本章小結(jié),Instead-of觸發(fā)器基于一個視圖,并允許通過視圖執(zhí)行DML操作。 系統(tǒng)觸發(fā)器是在DDL語句和系統(tǒng)事件上觸發(fā)的。 如果DML語句觸發(fā)了一個觸發(fā)器,并且這個觸發(fā)器嘗試引用該DML事件所處理的那個表,則將引發(fā)一個錯誤。 ALTER TRIGGER語句允許編譯器禁用或啟用觸發(fā)器。 想要從系統(tǒng)中刪除一個觸發(fā)器,可以使用DROP TRIGGER語句。 USER_TRIGGERS數(shù)據(jù)字典視圖包含了所有觸發(fā)器聲明信息以及源代碼。,
- 溫馨提示:
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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 六級上冊科學(xué)ppt課件-誰選擇了它們-教科版
- 護理核心制度培訓(xùn)一_圖文課件
- 部編《池子與河流》課件
- SWOT分析法(非常全面)課件
- 主題班會我的成長目標(biāo)課件
- 城市交通擁堵及治理總結(jié)課件
- 輸血相關(guān)性急性肺損傷課件
- 議論文的謀篇布局與論點的提出ppt課件
- 六級上冊科學(xué)ppt課件-地球的近鄰——月球-冀人版
- 疾病預(yù)防、冬季保暖-課件
- 中考英語語法復(fù)習(xí)之狀語從句ppt課件集4
- 《百分?jǐn)?shù)的意義和讀寫》參考ppt課件
- 主題班會堅持就是勝利課件
- 第二章--用人單位對大學(xué)生的要求概況ppt課件
- 教科版六年級科學(xué)上冊第三單元檢測卷(含答案)課件