




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
D第7章PL/SQL包與觸發(fā)器學(xué)習(xí)要點創(chuàng)建包調(diào)用和執(zhí)行包組件建立DML觸發(fā)器建立INSTEADOF觸發(fā)器
本章主要內(nèi)容
創(chuàng)建包調(diào)用和執(zhí)行包組件觸發(fā)器介紹建立DML觸發(fā)器建立INSTEADOF觸發(fā)器觸發(fā)器的維護(hù)B7.1創(chuàng)建包包是由存儲在一起的相關(guān)對象組成的PL/SQL存儲程序。它可以把相關(guān)的過程、函數(shù)組織在一起,這樣便于管理,提高了代碼性能。
包由兩個分離的部件組成:包頭和包體。包頭也叫包說明或包規(guī)范,它包括函數(shù)頭、過程頭、和外部可視數(shù)據(jù)結(jié)構(gòu)。在創(chuàng)建包時,一般先建立包頭,再建立包體。
B7.1.1包頭包頭用于定義包的公用組件,如:常量、類型、變量、游標(biāo)、過程和函數(shù)等。創(chuàng)建包必須首先創(chuàng)建包規(guī)范,創(chuàng)建包規(guī)范的語法如下:CREATE[ORREPLACE]PACKAGEpackage_name{AS|IS}public_variable_declarations|public_type_declarations|public_exception_declarations|function_declarations|procedure_specificationsEND[package_name]其中:package_name:包名。public_variable_declarations:公共變量聲明。public_type_declarations:公共類型聲明public_exception_declarations:公共異常聲明。function_declarations:函數(shù)聲明。procedure_specifications:過程聲明。7.1.2包體包體用于實現(xiàn)包頭所定義的過程和函數(shù)。關(guān)于包的基本規(guī)則如下:(1)在包頭聲明過的是外部可以調(diào)用的過程、函數(shù)、變量。在包頭中定義的所有的常量、變量、過程和函數(shù)等都是公有的;就是說在包頭內(nèi)定義的公有組件(常量、變量、過程和函數(shù))既可以在包內(nèi)使用也可以在包外部調(diào)用。(2)在包體內(nèi)也可以定義過程、函數(shù)、變量,但這些定義只能在包體內(nèi)可見。在包體內(nèi)的各個過程和函數(shù)本身定義的處理和變量都是私有的。就是說在包體中定義的私有組件(常量、變量、過程和函數(shù))都只能在包內(nèi)使用,不能由其他子程序調(diào)用。(3)在包中聲明的時候,必須是前向聲明的,也就是對象需要引用的另一個對象必須在前面首先聲明。(4)包頭是必須存在的,包體是可選的。(5)包頭必須在包體前創(chuàng)建,否則創(chuàng)建不了包體。(6)只在包頭中包括公用變量、過程、函數(shù)的聲明
創(chuàng)建包體使用CREATEPACKAGEBODY語句:CREATE[ORREPLACE]PACKAGEBODYpackage_name{AS|IS}private_variable_declarations|private_type_declarations|private_exception_declarations|private_cursor_declarations|function_declarations|procedure_specificationsEND[package_name]7.2調(diào)用和執(zhí)行包組件調(diào)用方法分為包內(nèi)調(diào)用和包外調(diào)用。1.包內(nèi)調(diào)用【例】在過程addemp中對validate過程進(jìn)行包內(nèi)調(diào)用。CREATEORREPLACEPACKAGEBODYmypackageISPROCEDUREaddemp(enoNUMBER,nameVARCHAR2,salNUMBER,dnoNUMBER)ISBEGINIFvalidate(dno)THENINSERTINTOemp(empno,ename,sal,deptno)VALUES(eno,name,sal,dno);ELSEraise_application_error(-200010,'不存在該部門');ENDIF;EXCEPTIONWHENDUP_VAL_ON_INDEXTHENraise_application_error(-200012,'該員工已經(jīng)存在,重復(fù)插入');ENDmypackage;C2.調(diào)用包的公共變量包名:mypackage,公共變量pub_pSQL>EXECmypackage.pub_p:=20;3.調(diào)用包的公共過程包名:mypackage,公共過程:addemp(enoNUMBER,nameVARCHAR2,salNUMBER,dnoNUMBER)SQL>EXECmypackage.addemp(1111,'SCOTT',5600);SQL>EXECmypackage.addemp(1111,'SCOTT',5600,88);D4.調(diào)用包的公共函數(shù)包名:mypackage,公共函數(shù):get_sal(enoNUMBER)功能:把員工號eno作為輸入?yún)?shù),得到此員工的工資,返回一個NUMBER類型的數(shù)據(jù)。SQL>VARsalaryNUMBERSQL>EXEC:salary:=mypackage.get_sal(9012);SQL>PRINTsalary執(zhí)行結(jié)果:SALARY---------5600C7.3觸觸發(fā)器介紹7.3.1觸觸發(fā)器的的作用與特點點觸發(fā)器的主要要作用是能夠夠?qū)崿F(xiàn)由主建建和外鍵所不不能保證的參參照完整性和和數(shù)據(jù)的一致致性。除此之之外,觸發(fā)器器還有許多不不同的作用::(1)強(qiáng)化約約束。觸發(fā)器器能夠?qū)崿F(xiàn)比比CHECK語句更為為復(fù)雜的約束束。(2)跟蹤變變化。觸發(fā)器器可以偵測數(shù)數(shù)據(jù)庫內(nèi)部的的操作,在沒沒有更新權(quán)限限的情況下不不允許對數(shù)據(jù)據(jù)庫進(jìn)行更新新操作。(3)安全性性??梢曰谟跀?shù)據(jù)庫的值值使用戶具有有操作數(shù)據(jù)庫庫的某種權(quán)利利。例如:①①可以基于時時間限制用戶戶的操作,例例如,不允許許下班后和節(jié)節(jié)假日修改數(shù)數(shù)據(jù)庫數(shù)據(jù);;②可以基于于數(shù)據(jù)庫中的的數(shù)據(jù)限制用用戶的操作,,例如,不允允許股票的價價格的升幅一一次超過10%;③審計計??梢愿欅櫽脩魧?shù)據(jù)據(jù)庫的操作,,審計用戶操操作數(shù)據(jù)庫的的語句,把用用戶對數(shù)據(jù)庫庫的更新寫入入審計表。(4)自動生生成導(dǎo)出的列列值。(5)防止無無效的事務(wù)。。(6)在分布布式數(shù)據(jù)庫中中實施跨越結(jié)結(jié)點的參照完完整性。(7)提供透透明事件日志志。A7.3.2觸觸發(fā)器的的類型和組成成1.觸發(fā)器的的類型對每一觸發(fā)語語句可有四種種類型觸發(fā)器器:(1)行觸發(fā)發(fā)器。對受觸觸發(fā)語句所影影響的每一行行進(jìn)行觸發(fā)。。(2)語句觸觸發(fā)器。定義義語句觸發(fā)器器時要指定觸觸發(fā)時間,即即觸發(fā)器是在在觸發(fā)語句執(zhí)執(zhí)行之后觸發(fā)發(fā)還是在之前前觸發(fā)。(3)BEFORE觸發(fā)發(fā)器。該觸發(fā)發(fā)器執(zhí)行觸發(fā)發(fā)器動作是在在觸發(fā)語句執(zhí)執(zhí)行之前。(4)AFTER觸發(fā)器器。該觸發(fā)器器執(zhí)行觸發(fā)器器動作是在觸觸發(fā)語句執(zhí)行行之后。C2.觸發(fā)器的的組成一個觸發(fā)器有有三個基本部部件:觸發(fā)事事件或語句、、觸發(fā)器條件件、觸發(fā)器動動作。觸發(fā)事件是指指引起觸發(fā)器器激發(fā)的事件件。觸發(fā)語句句指數(shù)據(jù)操縱縱(DML))語句,這些些語句是INSERT、、UPDATE或DELETE語句句。觸發(fā)器條件是是一個布爾表表達(dá)式。觸發(fā)器的動作作是一個PL/SQL塊塊(過程),,由SQL語語句和PL/SQL語句句組成。觸發(fā)發(fā)語句發(fā)出后后,當(dāng)觸發(fā)器器的條件為TRUE時,,它被執(zhí)行。。D7.4建建立DML觸觸發(fā)器DML事件觸觸發(fā)器可以是是語句或行級級觸發(fā)器。DML語句觸觸發(fā)器在觸發(fā)發(fā)語句之前或或之后觸發(fā)。。DML行級級觸發(fā)器在語語句影響的行行變化之前或或之后觸發(fā)。。用戶可以給給單一事件和和類型定義多多個觸發(fā)器,,但沒有任何何方法可以增增強(qiáng)多觸發(fā)器器觸發(fā)的命令令。7.4.1語語句觸發(fā)發(fā)器創(chuàng)建觸發(fā)器的的語法如下::CREATE[ORREPLACE]TRIGGER觸發(fā)器器名觸發(fā)時時間觸發(fā)事事件ON表名[FOREACHROW]PL/SQL語句其中:(1)觸發(fā)器器名。觸發(fā)器器對象的名稱稱。由于觸發(fā)發(fā)器是數(shù)據(jù)庫庫自動執(zhí)行的的,因此該名名稱只是一個個名稱,沒有有實質(zhì)的用途途。觸發(fā)器的的名稱與過程程名稱不一樣樣,它有單獨獨的命名空間間,觸發(fā)器可可以與表名或或過程名同名名,但是在同同一個SCHEMA中的的觸發(fā)器名稱稱不能相同。。(2)觸發(fā)時時間。指明觸觸發(fā)器何時執(zhí)執(zhí)行。BEFORE表示在數(shù)據(jù)據(jù)庫動作之前前觸發(fā)器執(zhí)行行。AFTER表表示在數(shù)據(jù)庫庫動作之后觸觸發(fā)器執(zhí)行。。(3)觸發(fā)事事件。指明哪哪些數(shù)據(jù)庫動動作會觸發(fā)此此觸發(fā)器:INSERT:數(shù)據(jù)庫插插入會觸發(fā)此此觸發(fā)器。UPDATE:數(shù)據(jù)庫修修改會觸發(fā)此此觸發(fā)器。DELETE:數(shù)據(jù)庫刪刪除會觸發(fā)此此觸發(fā)器。(4)表名。。數(shù)據(jù)庫觸發(fā)發(fā)器所在的表表。FOREACHROW:對表的的每一行觸發(fā)發(fā)器執(zhí)行一次次。如果沒有有這一選項,,則只對整個個表執(zhí)行一次次。1.建立BEFORE語語句觸發(fā)器器【例】現(xiàn)在向向數(shù)據(jù)庫SCHOOL中中增加一個新新表DEL_TCH_PT,表的結(jié)結(jié)構(gòu)同表TCH_PT一一樣,主要存存放從TCH_PT表中中刪除的記錄錄。因此需要要創(chuàng)建一個觸觸發(fā)器,當(dāng)表表TCH_PT每刪除一一行,就把刪刪除的記錄寫寫到日志DEL_TCH_PT中。。觸發(fā)器創(chuàng)建如如下:CREATEORREPLACETRIGGERTCH_HISBEFOREDELETEONTCH_PTFROEACHROWBEGININSERTINTODEL_TCH_PT(XH,XM,XB)VALUES(:OLD.XH,:OLD.XM,:OLD.XB)ENDTCH_HIS;其中OLD修修飾訪問操作作前列的值。。2.使用條件件謂詞觸發(fā)器同時包包含多個事件件(插入、更更新、刪除)),為了區(qū)分分具體哪個事事件可以使用用相應(yīng)的三個個條件謂詞::INSERTING:當(dāng)當(dāng)觸發(fā)事件為為INSERT,該謂詞詞返回TRUE,否則為為FALSE。UPDATING:當(dāng)觸觸發(fā)事件為UPDATE,該謂詞返返回TRUE,否則為FALSE。。DELETING:當(dāng)觸觸發(fā)事件為DELETE,該謂詞返返回TRUE,否則為FALSE。。3.建立AFTER語語句觸發(fā)器【例】利用觸觸發(fā)器在數(shù)據(jù)據(jù)庫SCHOOL的TCH_PT中執(zhí)行插插入、更新和和刪除3種操操作后給出相相應(yīng)的提示。。CREATETRIGGERTISHI_TCHAFTERINSERTORUPDATEORDELETEONTCH_PTFOREACHROWDECLAREINFORCHAR(10);BEGINIFINSETINGTHENINFOR:="插入";ELSIFUPDATINGTHENINFOR:="更更新";ELSEINFOR:="刪除";ENDIF;INSERTINTOSQL_INFORVALUES(INFOR);ENDTISHI_TCH;7.4.2行行觸發(fā)器器行觸發(fā)器是執(zhí)執(zhí)行DML操操作時,每作作用一行就觸觸發(fā)一次的觸觸發(fā)器,主要要用于審計數(shù)數(shù)據(jù)變化。建立行觸發(fā)器器的語法如下下:CREATE[ORREPLACE]TRIGGERtrigger_nameTimingevent1[ORevent2ORevent3]ONtable_namePL/SQLblobk;其中:trigger_name是是觸發(fā)器名稱稱,Timing是觸觸發(fā)時機(jī),event是是觸發(fā)事件,,table_name指DML操作的表表名。1.建立BEFORE行行觸發(fā)器【例】保障職職工的月薪不不低于5000元。觸發(fā)器創(chuàng)建如如下:CREATEORREPLACETRIGGERtrigger_up_salBEFOREUPDATEOFsalONEMPFOREACHROWBEGINIF:new.sal<5000THENRaise_application_error(-20010,'工資不能能低于5000');ENDIF;END;【例】把職工工進(jìn)行修改的的記錄全部寫寫入審計表,,以便于審計計。審計表如下::AUDIT(nameVARCHAR2(10),oldsalNUMBER,newsalNUMBER,timeDATE)。創(chuàng)建觸發(fā)器如如下:CREATEORREPLACETRIGGERtrigger_up_salAFTERUPDATEOFsalONEMPFOREACHROWDECLAREcountINT;BEGINSELECTcount(*)INTOcount//查詢審審計表的記錄錄個數(shù)存入變變量CountFROMauditWHEREname:old.ename;IFcount=0THEN//如果審計計表為空,插插入記錄INSERTINTOauditVALUES(:old.ename,:old.sal,:new.sal,SYSDATE)ELSE//如如果審計表不不為空,更新新記錄UPDATEauditSEToldsal=:old.sal,newsal=:new.sal,time=SYSDATEWHEREname=:old.enameENDIF;END2.建立AFTER行行觸發(fā)器7.5建建立INSTEADOF觸發(fā)器器INSTEADO
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 江蘇省啟東市高中數(shù)學(xué) 第一章 三角函數(shù) 第6課時 1.2.2 同角三角函數(shù)關(guān)系(2)說課稿 蘇教版必修4
- 2025年天津會計從業(yè)資格考試答案
- 2025年初級會計考試真題整編(附答案)
- 2025年貴州省公務(wù)員錄用考試《行測》真題及答案解析
- 2025年傳染病報告規(guī)范測試題附答案
- 2025年江蘇省公務(wù)員考試時事政治考試試卷帶解析及參考答案黃金題型
- 2025年國考申論真題及參考答案
- 2025年隔音降噪設(shè)備:隔音吸聲材料項目合作計劃書
- 2025年微波集成電路AL2O3基片項目發(fā)展計劃
- 2025年藥物緩釋材料合作協(xié)議書
- 成人反流誤吸高危人群全身麻醉管理專家共識(2025版)解讀 3
- 2025-2026學(xué)年遼海版(2024)小學(xué)美術(shù)二年級上冊《巧用材料》教學(xué)設(shè)計
- 2025??低曇曨l安全門禁系統(tǒng)使用手冊
- 2025中數(shù)聯(lián)物流科技(上海)有限公司招聘考試參考試題及答案解析
- 量子計算在人工智能領(lǐng)域的發(fā)展趨勢與2025年應(yīng)用案例分析報告
- 安檢流程課件
- 2025綜合能力測試真題題庫及答案
- 2025-2026學(xué)年滬教牛津版(深圳用)小學(xué)英語五年級上冊教學(xué)計劃及進(jìn)度表
- 綜合與實踐最短路徑問題-牧民飲馬問題(教學(xué)課件)
- 帶狀皰疹后神經(jīng)痛護(hù)理查房
- 保密文印管理辦法
評論
0/150
提交評論