版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第 一 章第四章一PL/SQL編程第章企業(yè)級(jí)卓越人才培養(yǎng)目標(biāo)掌握PL/SQL語(yǔ)法結(jié)構(gòu)掌握數(shù)據(jù)類型的分類及變量的使用掌握各種運(yùn)算符的使用掌握各種控制語(yǔ)句的使用掌握在PL/SQL中進(jìn)行異常處理PL/SQL語(yǔ)言PL/SQL是一種高級(jí)數(shù)據(jù)庫(kù)程序設(shè)計(jì)語(yǔ)言 PL/SQL代表面向過(guò)程化的語(yǔ)言與S Q L語(yǔ)言的結(jié)合 PL/SQL將第四代語(yǔ)言的強(qiáng)大功能和靈活性與第三代語(yǔ)言的過(guò)程結(jié)構(gòu)的優(yōu)勢(shì)融為一體 PL/SQL具有編程結(jié)構(gòu)、語(yǔ)法和邏輯機(jī)制 PL/SQL用于在各種環(huán)境下對(duì)Oracle數(shù)據(jù)庫(kù)進(jìn)行快速高效訪問(wèn)PL/SQL語(yǔ)言PL/SQL語(yǔ)言內(nèi)容PL/SQL塊結(jié)構(gòu)變量與常量數(shù)據(jù)類型運(yùn)算符流程控制空操作和空值PL/SQL塊
2、結(jié)構(gòu)PL/SQL程序包含了一個(gè)或多個(gè)PL/SQL塊PL/SQL塊語(yǔ)法結(jié)構(gòu) DECLARE 聲明部分BEGIN 執(zhí)行部分EXCEPTION 異常處理部分END;PL/SQL塊結(jié)構(gòu)示例:在數(shù)據(jù)庫(kù)emp表中修改一名雇員記錄,如果沒(méi)有該記錄則創(chuàng)建一條新記錄 DECLARE v_no number(4) := 8033; -定義變量 v_name varchar2(10) := 張三; v_job varchar2(9) := SALESMAN;BEGIN UPDATE emp SET job = v_job WHERE empno = v_no; -更新雇員表 IF SQL%NOTFOUND THEN
3、 -檢查記錄是否存在,如不存在就插入記錄 INSERT INTO emp(empno,ename,job) VALUES( v_no, v_name, v_job ); END IF;END;/變量與常量 聲明變量variable_name CONSTANT datatype NOT NULL := DEFAULT EXPRESSION給變量賦值有兩種方式 DECLARE var1 number :=1; /*聲明變量并初始化*/ var2 varchar2(10); /*聲明變量*/BEGIN var2 := zhangsan; /*給變量賦值*/END;/變量與常量可以通過(guò)SELECT I
4、NTO (或 FETCH INTO) 給變量賦值 DECLARE var1 varchar2(10); BEGIN SELECT ename INTO var1 FROM emp WHERE empno=7788; dbms_output.put_line(var1);END;/變量與常量常量:值在程序內(nèi)部不能改變聲明常量必須包括關(guān)鍵字CONSTANT var1 constant number := 3 ;數(shù)據(jù)類型標(biāo)量類型屬性類型用戶自定義類型數(shù)據(jù)類型屬性類型%type引用表中列的類型%rowtype 引用表中行的類型例如:-%typevar1 emp.ename%type;-%rowtype
5、var2 emp%rowtype;運(yùn)算符算術(shù)運(yùn)算符 +, -, *, /, mod關(guān)系運(yùn)算符, , =, , 0 THEN NULL;ELSE dbms_output.put_line(正常);END IF;PL/SQL異常處理PL/SQL塊中可以有異常處理部分EXCEPTIONWHEN excep_name1 THEN WHEN excep_name2 THEN WHEN OTHERS THEN END;異常有兩種 預(yù)定義的異常 用戶定義的異常系統(tǒng)預(yù)定義異常例:除零異常declare num number(3) := 10 ; zero number(3) := 0 ; result num
6、ber(6) ;begin result := num / zero ;exception when ZERO_DIVIDE then dbms_output.put_line(被零除!);end;用戶定義異常當(dāng)部門員工數(shù)超過(guò)規(guī)定人數(shù)引發(fā)自定義異常declare overnumber EXCEPTION; -用戶定義的異常 maxnum constant number := 5; num number;begin select count(*) into num from emp where deptno = &部門編號(hào) ; if num maxnum then RAISE overnumbe
7、r; -使用RAISE語(yǔ)句引發(fā)自定義異常 end if; dbms_output.put_line(該部門雇員人數(shù)為: | num);exception when overnumber then dbms_output.put_line(該部門雇員人數(shù)超過(guò)了規(guī)定人數(shù)!);end;總結(jié)PL/SQL語(yǔ)言是面向過(guò)程語(yǔ)言與SQL語(yǔ)言的結(jié)合數(shù)據(jù)在數(shù)據(jù)庫(kù)與PL/SQL程序之間是通過(guò)變量進(jìn)行傳遞的。變量通常是在PL/SQL塊的聲明部分定義除了15種標(biāo)量數(shù)據(jù)類型外,Oracle還提供了屬性類型。并允許用戶自定義類型Oracle中使用的運(yùn)算符,流程控制語(yǔ)法和其他語(yǔ)言的類似Oracle中提供了異常(Excepti
8、on)這一處理錯(cuò)誤情況的方法。在PL/SQL代碼部分執(zhí)行過(guò)程中無(wú)論何時(shí)發(fā)生錯(cuò)誤,控制自動(dòng)地轉(zhuǎn)向執(zhí)行異常部分在 PL/SQL中可以處理系統(tǒng)預(yù)定義的異常,也可以使用自定義的異常2022/8/26第四章二游標(biāo)、集合和OOP的概念第章企業(yè)級(jí)卓越人才培養(yǎng)21目標(biāo)理解游標(biāo)、集合的概念和作用掌握在PL/SQL中游標(biāo)的基本用法了解Oracle數(shù)據(jù)庫(kù)中OOP的基本概念22游標(biāo)PL/SQL用游標(biāo)(cursor)來(lái)管理 select語(yǔ)句游標(biāo)分類靜態(tài)游標(biāo)顯式游標(biāo)(explicit cursor)隱式游標(biāo)(implicit cursor) 游標(biāo)變量 23顯式游標(biāo)顯式游標(biāo)的使用步驟聲明游標(biāo)(declare)打開(kāi)游標(biāo)(op
9、en)讀取數(shù)據(jù)關(guān)閉游標(biāo)(close)24顯式游標(biāo)聲明游標(biāo) CURSOR cursor_nameISselect_statement示例 DECLARE CURSOR emp_cur IS select ename,job,sal from emp;25顯式游標(biāo)打開(kāi)游標(biāo) OPEN cursor_name;示例 BEGIN OPEN emp_cur ; dbms_output.put_line( emp_cur%ROWCOUNT );END;26顯式游標(biāo)讀取數(shù)據(jù) FETCH cursor_name INTO variable_name,n;示例 BEGIN OPEN emp_cur ; FETCH
10、 emp_cur INTO name, job, sal ; /*從結(jié)果集中提取一行數(shù)據(jù)*/ WHILE emp_cur%FOUND LOOP dbms_output.put_line ( name | | job | | sal ) ; FETCH emp_cur INTO name, job, sal ; /*在循環(huán)中每次提取一行數(shù)據(jù)*/ END LOOP; CLOSE emp_cur ;END;27顯式游標(biāo)關(guān)閉游標(biāo)CLOSE cursor_name ;示例 BEGIN CLOSE emp_cur ;END;28顯式游標(biāo)游標(biāo)的屬性%FOUND 檢測(cè)當(dāng)前游標(biāo)指向的行是否有數(shù)據(jù)%NOTFOUN
11、D 與%FOUND相反%ROWCOUNT 從游標(biāo)中已提取的總行數(shù)%ISOPEN 檢測(cè)游標(biāo)是否已打開(kāi)29隱式游標(biāo)在PL/SQL程序段中使用SELECT語(yǔ)句進(jìn)行操作,PL/SQL語(yǔ)言會(huì)隱含地處理游標(biāo)定義示例: DECLARE name varchar2(10);BEGIN select ename into name from emp where empno=7934; dbms_output.put_line( name );END;30隱式游標(biāo)使用隱式游標(biāo)要注意以下幾點(diǎn) 每個(gè)隱式游標(biāo)必須有一個(gè)INTOINTO接受的變量類型要與列表的一致隱式游標(biāo)一次僅能返回一行數(shù)據(jù),使用時(shí)必須檢查異常。最常見(jiàn)的
12、異常有“no_data_found”和“too_many_rows”31游標(biāo)變量游標(biāo)變量是動(dòng)態(tài)的,它不與特定的查詢綁定在一起??梢詾槿魏渭嫒莸牟樵兇蜷_(kāi)游標(biāo)變量,從而提高更好的靈活性。創(chuàng)建游標(biāo)變量有兩個(gè)步驟:定義 REF CURSOR 類型,即引用游標(biāo)類型聲明這種類型的游標(biāo)變量32游標(biāo)變量聲明一個(gè)引用游標(biāo)類型-強(qiáng)類型游標(biāo)(指定返回類型)TYPE dept_cur IS REF CURSOR RETURN dept%rowtype;-弱類型游標(biāo)(沒(méi)有返回類型)TYPE mycur IS REF CURSOR ;33游標(biāo)變量聲明游標(biāo)變量DECLARE TYPE dept_cur IS REF CUR
13、SOR RETURN dept%rowtype; cur1 dept_cur ; /*聲明游標(biāo)變量*/打開(kāi)游標(biāo)變量OPEN cur1 FOR select * from dept where deptno=10;34游標(biāo)變量示例DECLARE TYPE dept_cur IS REF CURSOR RETURN dept%rowtype; cur1 dept_cur ; dept1 dept%rowtype;BEGIN OPEN cur1 FOR select * from dept where deptno=10; FETCH cur1 INTO dept1; dbms_output.put
14、_line(dept1.deptno| |dept1.dname| |dept1.loc); OPEN cur1 FOR select * from dept where dname=SALES; FETCH cur1 INTO dept1; dbms_output.put_line(dept1.deptno| |dept1.dname| |dept1.loc); CLOSE cur1;END;35集合集合類似于其他第3代語(yǔ)言中使用的數(shù)組PL/SQL語(yǔ)言提供了3種不同的集合類型 聯(lián)合數(shù)組(也稱為索引表)嵌套表可變數(shù)組 36聯(lián)合數(shù)組聯(lián)合是具有Oracle的數(shù)據(jù)類型或用戶自定義類型的一維體 聲明聯(lián)
15、合數(shù)組的語(yǔ)法格式TYPE table_typeISTABLE OF type INDEX BY binary_integer ;37聯(lián)合數(shù)組聯(lián)合數(shù)組示例DECLARE TYPE emp_name IS TABLE OF varchar2(10); /*聲明類型*/ INDEX BY binary_integer; names emp_name; /*聲明變量*/BEGIN names(1) := 張飛 ; names(2) := 關(guān)羽 ;END38嵌套表嵌套表和聯(lián)合數(shù)組類似,唯一不同是沒(méi)有INDEX BY binary_integer子句 嵌套表使用前需要初始化DECLARE TYPE stu
16、tab IS TABLE OF varchar2(20); stu stutab := stutab(張三, 李四, 王五);BEGIN for i in 1.3 loop dbms_output.put_line(stu(i); end loop;END;39可變數(shù)組可變數(shù)組的語(yǔ)法格式如下:TYPE type_nameISVARRAY | VARYING ARRAY(max_size) OF element_type NOT NULL40可變數(shù)組可變數(shù)組也需要初始化。需要注意賦值的數(shù)量必須保證不大于可變數(shù)組的最大上限 DECLARE TYPE montharr IS VARRAY(12) O
17、F varchar2(10); months montharr := montharr(January,February,March);BEGIN months.extend(2); /*給months可變數(shù)組增加兩個(gè)元素*/ months(4) := April;months(5) := June; FOR i IN 1.5 LOOP dbms_output.put_line(months(i); END LOOP;END;41OOP的概念自O(shè)racle9i以來(lái),Oracle不再是單純的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)了,它在關(guān)系數(shù)據(jù)庫(kù)模型的基礎(chǔ)上,添加了一系列面向?qū)ο蟮奶匦?,其主要目的是把用戶類型直接?/p>
18、射到數(shù)據(jù)庫(kù)的類型,從而方便編程。Oracle面向?qū)ο蟮淖罨驹厥撬膶?duì)象類型,也就是Type Oracle中與面向?qū)ο蠹夹g(shù)相關(guān)的數(shù)據(jù)類型主要有:對(duì)象類型,可變數(shù)組,嵌套表,對(duì)象表,對(duì)象視圖等 42OOP的概念使用對(duì)象數(shù)據(jù)類型的優(yōu)點(diǎn):更容易與Java、C+編寫的對(duì)象應(yīng)用程序交互。獲取便捷。一次對(duì)象類型請(qǐng)求就可以從多個(gè)關(guān)系表中獲取信息,通過(guò)一次網(wǎng)絡(luò)往復(fù)即可返回??梢园褜?duì)象數(shù)據(jù)類型理解為在OOP語(yǔ)言中的類。創(chuàng)建一個(gè)對(duì)象數(shù)據(jù)類型相當(dāng)于創(chuàng)建一個(gè)類,以后我們可以實(shí)例化,繼承等等 43總結(jié)顯式游標(biāo)用于處理返回一到多行結(jié)果集的select語(yǔ)句,顯式游標(biāo)首先要聲明,在使用前要打開(kāi),使用完要關(guān)閉。隱式游標(biāo)即簡(jiǎn)單
19、地編碼select語(yǔ)句。當(dāng)select語(yǔ)句預(yù)計(jì)只返回一行時(shí)使用隱式游標(biāo)。使用游標(biāo)變量需要先聲明引用游標(biāo)類型,再定義該種類型的游標(biāo)變量。它不與特定的查詢綁定在一起,而是可以動(dòng)態(tài)地打開(kāi)不同的查詢。處理結(jié)果集的方式與顯式游標(biāo)基本相同。集合包括:聯(lián)合數(shù)組、嵌套表、可變數(shù)組,它們都是以數(shù)組的方式操縱數(shù)據(jù),可以使用集合在PL/SQL中完成一些復(fù)雜的操作。Oracle 數(shù)據(jù)庫(kù)是一種對(duì)象關(guān)系型數(shù)據(jù)庫(kù),它在關(guān)系型數(shù)據(jù)庫(kù)的基礎(chǔ)上加入了面向?qū)ο蟮母拍?2022/8/26第 三 章第四章三存儲(chǔ)過(guò)程和函數(shù)第章企業(yè)級(jí)卓越人才培養(yǎng)45目標(biāo)理解子程序的概念和作用掌握使用PL/SQL語(yǔ)言創(chuàng)建和調(diào)用存儲(chǔ)過(guò)程和函數(shù)掌握在Java語(yǔ)
20、言中調(diào)用存儲(chǔ)過(guò)程和函數(shù)掌握事務(wù)在子程序中的應(yīng)用46概述PL/SQL塊主要有兩類:命名塊和匿名塊匿名塊(以DECLARE或BEGIN開(kāi)始)每次使用都要編譯,并且不能從其他地方調(diào)用命名塊也叫做子程序或過(guò)程,主要有三類:存儲(chǔ)過(guò)程函數(shù)程序包 47概述子程序有如下一些優(yōu)點(diǎn):執(zhí)行速度快 提高系統(tǒng)性能 確保數(shù)據(jù)庫(kù)的安全 允許自動(dòng)執(zhí)行本章主要介紹命名塊結(jié)構(gòu),包括過(guò)程和函數(shù)。以及在過(guò)程(函數(shù))應(yīng)用數(shù)據(jù)庫(kù)事務(wù)48存儲(chǔ)過(guò)程主要內(nèi)容創(chuàng)建過(guò)程調(diào)用過(guò)程過(guò)程的語(yǔ)法過(guò)程的參數(shù)模式過(guò)程中的異常處理過(guò)程的修改和刪除49創(chuàng)建過(guò)程如果要經(jīng)常性對(duì)表實(shí)施插入操作,可以使用存儲(chǔ)過(guò)程以提高執(zhí)行效率CREATE OR REPLACE PROC
21、EDURE addUser ( p_id Users.id%type, p_name Users.uname%type, p_pwd Users.pwd%type)ASBEGIN insert into Users(id, uname, pwd) values(p_id, p_name, p_pwd); commit;END addUser;50調(diào)用過(guò)程執(zhí)行存儲(chǔ)過(guò)程的語(yǔ)法格式 EXECUTE procedure_name (parameter,n) 執(zhí)行存儲(chǔ)過(guò)程插入記錄 SQL EXEC addUser(0001,zhangsan,zhang01); 51調(diào)用過(guò)程在PL/SQL塊中調(diào)用存儲(chǔ)過(guò)程
22、 DECLARE v_id Users.id%type := 0002; v_name Users.uname%type := lisi; v_pwd Users.pwd%type :=li02;BEGIN addUser(v_id, v_name, v_pwd);END; 52過(guò)程的語(yǔ)法CREATE PROCEDURE用于創(chuàng)建存儲(chǔ)過(guò)程 CREATE OR REPLACE PROCEDURE c_name (parameter parameter_mode datatype,.n)IS | AS local_declarationBEGIN sql_statementEXC
23、EPTION exception_handlerEND procedure_name;53過(guò)程的參數(shù)模式過(guò)程的形參有三種模式:IN, OUT, IN OUTIN參數(shù):輸入型參數(shù),IN模式的參數(shù)在傳遞時(shí),實(shí)參可以是變量,也可以是常量 EXEC addUser(0001,zhangsan,zhang01); /*實(shí)參為常量*/-或者addUser(v_id, v_name, v_pwd); /*實(shí)參為變量*/54過(guò)程的參數(shù)模式OUT參數(shù):輸出型參數(shù)。通過(guò)OUT參數(shù)可以在過(guò)程調(diào)用后獲得一個(gè)返回值示例:/*計(jì)算指定部門中,工資在1500元以上的員工人數(shù) */CREATE PROCEDURE count
24、Sal( p_deptno IN emp.deptno%type, /*in參數(shù)*/ p_count OUT number /*out參數(shù)*/)ASBEGIN select count(*) into p_count from emp where sal = 1500 and deptno = p_deptno;END countSal;55過(guò)程的參數(shù)模式調(diào)用帶OUT參數(shù)的存儲(chǔ)過(guò)程(實(shí)參只能是變量,不能是常量 ) DECLARE v_deptno emp.deptno%type; v_count number;BEGIN v_deptno := &部門編號(hào); /*輸入一個(gè)部門編號(hào)*/ coun
25、tSal(v_deptno, v_count); /*調(diào)用存儲(chǔ)過(guò)程*/ dbms_output.put_line(人數(shù)為: | v_count); END;56過(guò)程的參數(shù)模式IN OUT參數(shù):輸入輸出型參數(shù)。這是一種最靈活的方式,該類型是IN和OUT的組合。IN OUT參數(shù)的實(shí)參既可以傳值給過(guò)程,又可以從過(guò)程獲得返回值。 調(diào)用時(shí)實(shí)參只能是變量,不能是常量 57過(guò)程中的異常處理為了不讓存儲(chǔ)過(guò)程因?yàn)槌霈F(xiàn)異常而終止執(zhí)行,可以在過(guò)程中進(jìn)行異常處理 CREATE OR REPLACE PROCEDURE findEmp( p_empno IN emp.empno%type, p_ename OUT em
26、p.ename%type)ASBEGIN select ename into p_ename from emp where empno = p_empno;EXCEPTION when NO_DATA_FOUND then p_ename := null; END;58過(guò)程的修改和刪除過(guò)程的修改,仍然使用create or replace procedure命令CREATE OR REPLACE PROCEDURE countSal( p_count OUT number /*out參數(shù)*/)ASBEGIN select count(*) into p_count from emp where
27、 sal = 1500;END countSal;過(guò)程的刪除,使用drop procedureDROP PROCEDURE countSal ;59事務(wù)處理事務(wù)是用于確保數(shù)據(jù)庫(kù)的一致性事務(wù)必須滿足四個(gè)原則(ACID)原子性(atomicity) 一致性(consistency) 隔離性(isolation) 持久性(durability) 60事務(wù)與存儲(chǔ)過(guò)程存儲(chǔ)過(guò)程或許是保證事務(wù)正確的最容易 、最可理解的方法 如果遵守“一個(gè)存儲(chǔ)過(guò)程調(diào)用就是一個(gè)事務(wù)”的編程范例,可以更輕松地控制事務(wù)和建立新事務(wù)61事務(wù)與存儲(chǔ)過(guò)程示例:/*一個(gè)把資金從儲(chǔ)蓄帳戶轉(zhuǎn)移到支票帳戶的ATM事務(wù) */CREATE OR R
28、EPLACE PROCEDURE savingsToChecking ( p_accid number, /*指定帳戶編號(hào)*/ p_num number /*指定需要轉(zhuǎn)帳的金額*/ ) ASBEGIN update accounts set balance = balance - p_num where accid = p_accid and type = savings; /*資金從儲(chǔ)蓄帳戶轉(zhuǎn)出*/ update accounts set balance = balance + p_num where accid = p_accid and type = checking; /*資金轉(zhuǎn)入支票
29、帳戶*/ commit; /*事務(wù)完成提交*/EXCEPTION when others then rollback; /*出現(xiàn)任何異常則回退該事務(wù)*/END;62函數(shù)函數(shù)是用來(lái)計(jì)算值的的一種子程序函數(shù)與過(guò)程在結(jié)構(gòu)上很相似,不同的是函數(shù)有一條RETURN語(yǔ)句,用來(lái)返回值 63創(chuàng)建函數(shù)假設(shè)我們要查詢一個(gè)用戶zhangsan是否在Users表中存在,創(chuàng)建函數(shù)如下:CREATE OR REPLACE FUNCTION existUser( p_name Users.uname%type)RETURN booleanIS t_count number;BEGIN select count(uname)
30、 into t_count from Users where uname = p_name; if t_count 0 then return true; /*如果存在返回true */ else return false; /*如果不存在的返回false */ end if;END existUser;64函數(shù)的調(diào)用在PL/SQL中調(diào)用函數(shù)DECLARE existed boolean;BEGIN existed := existUser(zhangsan); /*調(diào)用函數(shù)*/ if existed then dbms_output.put_line(該用戶存在); else dbms_ou
31、tput.put_line(該用戶不存在); end if;END;65函數(shù)的語(yǔ)法create function命令用于創(chuàng)建函數(shù)CREATE OR REPLACE FUNCTION schema.function_name /*函數(shù)名*/ (parameter parameter_mode datatype,.n) /*參數(shù)定義部分*/RETURN return_type /*定義返回值類型*/IS | AS local_declaration /*局部變量聲明*/BEGIN function_body /*函數(shù)體部分*/ RETURN expression /*返回語(yǔ)句*/EXCEPTION
32、 exception_handler /*異常處理部分*/END function_name;66函數(shù)與過(guò)程的比較 函數(shù)和過(guò)程都是子程序,有很多相同之處。函數(shù)和過(guò)程的區(qū)別如下:過(guò)程函數(shù)作為一個(gè)PL/SQL語(yǔ)句來(lái)執(zhí)行作為表達(dá)式的一部分來(lái)調(diào)用可以沒(méi)有RETURN語(yǔ)句必須包含RETURN語(yǔ)句可以通過(guò)參數(shù)返回一個(gè)值必須通過(guò)RETURN語(yǔ)句返回一個(gè)值67總結(jié)Oracle 子程序是命名的PL/SQL塊,它存放在數(shù)據(jù)字典中,可以在不同用戶和應(yīng)用程序之間共享。子程序包括存儲(chǔ)過(guò)程和函數(shù)。子程序只編譯一次,并以可執(zhí)行文件形式存儲(chǔ),因此調(diào)用過(guò)程快速而且高效。如果不考慮數(shù)據(jù)庫(kù)的移植性,可以使用子程序來(lái)實(shí)現(xiàn)應(yīng)用程序的業(yè)
33、務(wù)邏輯。存儲(chǔ)過(guò)程沒(méi)有返回值,但可以通過(guò)OUT和IN OUT參數(shù)返回多個(gè)值。存儲(chǔ)過(guò)程作為一條PL/SQL語(yǔ)句來(lái)調(diào)用。函數(shù)必須指定一個(gè)返回值,并在函數(shù)體中用RETURN語(yǔ)句來(lái)返回。在函數(shù)中使用OUT或IN OUT參數(shù)返回多個(gè)值是一種不良的編程習(xí)慣。函數(shù)是作為PL/SQL表達(dá)式的的一部分來(lái)調(diào)用的。事務(wù)是用于確保數(shù)據(jù)庫(kù)的一致性。事務(wù)把數(shù)據(jù)庫(kù)從一個(gè)一致?tīng)顟B(tài)帶到下一個(gè)一致?tīng)顟B(tài)。事務(wù)ACID原則:原子性、一致性、隔離性、持久性。事務(wù)處理的主要語(yǔ)句:commit、rollback。2022/8/26第四章四觸發(fā)器第章企業(yè)級(jí)卓越人才培養(yǎng)目標(biāo)了解觸發(fā)器的概念和作用理解觸發(fā)器的語(yǔ)法掌握DML觸發(fā)器和INSTEAD
34、OF觸發(fā)器的創(chuàng)建和應(yīng)用了解程序包的概念和作用概述觸發(fā)器(trigger)是命名P L / S Q L塊的第四種類型 本章重點(diǎn)介紹如何創(chuàng)建不同類型的觸發(fā)器以及討論觸發(fā)器的一些應(yīng)用。另外還將介紹Oracle中程序包的概念 觸發(fā)器簡(jiǎn)介觸發(fā)器是一種過(guò)程,與表關(guān)系密切,用于保護(hù)表中的數(shù)據(jù) 當(dāng)一個(gè)基表被修改(INSERT、UPDATE或DELETE)時(shí),觸發(fā)器自動(dòng)執(zhí)行 觸發(fā)器可實(shí)現(xiàn)多個(gè)表之間數(shù)據(jù)的一致性和完整性 觸發(fā)器語(yǔ)法創(chuàng)建觸發(fā)器的具體語(yǔ)法: CREATE OR REPLACE TRIGGER schema.trigger_name BEFORE | AFTER | INSTEAD OF /*定義觸發(fā)器
35、種類*/DELETE OR INSERT OR UPDATEOF column,nON schema.table_name | view_name /*指定操作對(duì)象*/FOR EACH ROW WHEN(condition)trigger_body創(chuàng)建DML觸發(fā)器DML觸發(fā)器由DML語(yǔ)句激發(fā),并且由該語(yǔ)句的類型決定DML觸發(fā)器的類型可以定義DML觸發(fā)器進(jìn)行INSERT、UPDATE、DELETE操作DML觸發(fā)器可以在上述操作之前或之后激發(fā),也可以在行或語(yǔ)句操作上激發(fā)創(chuàng)建DML觸發(fā)器示例:實(shí)現(xiàn)自動(dòng)更新專業(yè)統(tǒng)計(jì)信息的功能 create or replace trigger UpdateMajorS
36、tatafter insert or delete or update on studentdeclare cursor cur is /*按專業(yè)分組統(tǒng)計(jì)學(xué)生人數(shù)和總積分*/ select major, count(*) ts, sum(credit) tc from student group by major;begin delete from major_stat; /*先刪除major_stat表中的所有記錄*/ for rec in cur loop /*將分組統(tǒng)計(jì)的新結(jié)果通過(guò)循環(huán)插入表中*/ insert into major_stat values(rec.major, rec.
37、ts, rec.tc); end loop;end;創(chuàng)建DML觸發(fā)器在執(zhí)行INSERT、UPDATE或DELETE語(yǔ)句時(shí),不論該語(yǔ)句影響了多少行,觸發(fā)器都只被觸發(fā)一次,這樣的觸發(fā)器可以稱為語(yǔ)句級(jí)觸發(fā)器 (如 UpdateMajorStat)“FOR EACH ROW”子 句可以指定觸發(fā)器是一個(gè)行級(jí)觸發(fā)器 創(chuàng)建DML觸發(fā)器行級(jí)觸發(fā)器示例:當(dāng)刪除學(xué)生表student中的一條記錄時(shí),將該記錄插入到quit_stu表中 create or replace trigger stuDeletebefore delete on student for each row /*指定行級(jí)觸發(fā)*/begininse
38、rt into quit_stu values(:old.id, :, :old.major, :old.credit);end;創(chuàng)建DML觸發(fā)器偽記錄 “:old” 和 “:new” “:old”代表操作完成前的舊記錄“:new”代表操作完成后的新記錄在執(zhí)行三種DML語(yǔ)句時(shí)“:old”和“:new”的存在情況 觸發(fā)語(yǔ)句:old:newINSERTNULL要插入的記錄 UPDATE 更新前的記錄 更新后的記錄 DELETE 要?jiǎng)h除的記錄 NULL創(chuàng)建DML觸發(fā)器使用偽記錄的例子:在emp表中調(diào)整雇員工資,要求工資只能增加不能降低create or replace trigger
39、 update_salbefore update of sal /*指定當(dāng)update語(yǔ)句修改sal列時(shí)觸發(fā)*/on empfor each rowwhen (:new.sal :old.sal) /*當(dāng)新的工資小于原有工資時(shí)才觸發(fā)*/begin :new.sal := :old.sal; /*新的工資賦予原來(lái)的值,即工資不變*/end;INSTEAD OF觸發(fā)器INSTEAD OF觸發(fā)器用于對(duì)視圖的DML觸發(fā),主要用于多表聯(lián)接的視圖例:在dept和emp表上建有如下視圖create or replace view emp_dept as select e.empno, e.ename, d.
40、deptno, d.dname from emp e, dept d where e.deptno = d.deptno;INSTEAD OF觸發(fā)器當(dāng)在emp_dept視圖上執(zhí)行插入操作時(shí),能夠把相應(yīng)的記錄插入到 Dept 和 emp 表中create or replace trigger insert_emp_deptinstead of insert on emp_deptbegin insert into dept(deptno, dname) values(:new.deptno, :new.dname); insert into emp(empno, ename, deptno) v
41、alues(:new.empno, :new.ename, :new.deptno);end;觸發(fā)器的修改與刪除修改觸發(fā)器的內(nèi)容,可以使用CREATE OR REPLACE語(yǔ)句來(lái)實(shí)現(xiàn) 禁用名為log_creations的觸發(fā)器 ALTER TRIGGER log_creations DISABLE ;重新啟用log_creations觸發(fā)器 ALTER TRIGGER log_creations ENABLE ;觸發(fā)器的修改與刪除刪除觸發(fā)器log_creations DROP TRIGGER log_creations ;查看所有當(dāng)前用戶的trigger: select * from user
42、_triggers;總結(jié)觸發(fā)器是一種過(guò)程。觸發(fā)器可實(shí)現(xiàn)多個(gè)表之間數(shù)據(jù)的一致性和完整性觸發(fā)器與子程序不同,它是在事件發(fā)生時(shí)隱式(自動(dòng))觸發(fā)并執(zhí)行觸發(fā)器的類型有3種:DML觸發(fā)器,INSTEAD OF觸發(fā)器,系統(tǒng)觸發(fā)器DML觸發(fā)器針對(duì)INSERT、UPDATE、DELETE操作,可以在這些操作之前或之后觸發(fā)。DML觸發(fā)器又包括行級(jí)觸發(fā)器和語(yǔ)句級(jí)觸發(fā)器。INSTEAD OF觸發(fā)器主要用于建立在多張基表上的視圖。2022/8/26第四章五數(shù)據(jù)庫(kù)開(kāi)發(fā)案例第章企業(yè)級(jí)卓越人才培養(yǎng)目標(biāo)了解數(shù)據(jù)庫(kù)開(kāi)發(fā)的流程理解需求分析方法理解數(shù)據(jù)庫(kù)邏輯結(jié)構(gòu)的設(shè)計(jì)方法掌握在Oracle中創(chuàng)建表,序列,存儲(chǔ)過(guò)程等數(shù)據(jù)庫(kù)對(duì)象86需求
43、分析用例描述詳細(xì)分析功能需求,將系統(tǒng)中的各個(gè)功能用用例來(lái)描述。展開(kāi)每個(gè)用例的細(xì)節(jié)和邏輯流程,每個(gè)用例描述應(yīng)包含前置條件、主事件流、其他事件流、后置條件觸發(fā)器可實(shí)現(xiàn)多個(gè)表之間數(shù)據(jù)的一致性和完整性 。87需求分析數(shù)據(jù)分析針對(duì)對(duì)用例描述階段的分析,歸納出詳細(xì)的實(shí)體。例如:用戶、產(chǎn)品貨單產(chǎn)品列表、訂貨單、出貨單和狀態(tài)數(shù)據(jù)等具體用例的數(shù)據(jù)。88創(chuàng)建DML觸發(fā)器89設(shè)計(jì)數(shù)據(jù)庫(kù)創(chuàng)建數(shù)據(jù)庫(kù)用戶授權(quán)create user SM identified by smdefault tablespace userstemporary tablespace tempquota 50m on users;grant cre
44、ate session,resource to SM;90設(shè)計(jì)數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)邏輯結(jié)構(gòu)設(shè)計(jì)和各表描述此階段是將數(shù)據(jù)庫(kù)對(duì)象和表一一對(duì)應(yīng),給出對(duì)應(yīng)的表結(jié)構(gòu)。91設(shè)計(jì)數(shù)據(jù)庫(kù)User表(用戶) 字段名稱數(shù)據(jù)類型長(zhǎng)度約束描述idnumber10主鍵,自增用戶idloginNamevarchar230not null登錄名passwordvarchar250密碼namevarchar2100用戶真實(shí)姓名addressvarchar2100聯(lián)系地址phonevarchar250聯(lián)系電話createDatedatenot null創(chuàng)建日期modifyDatedate修改日期statusnumber2外鍵狀態(tài)編號(hào)t
45、ypenumber2用戶類型92設(shè)計(jì)數(shù)據(jù)庫(kù)Product表(產(chǎn)品)字段名稱數(shù)據(jù)類型長(zhǎng)度約束描述idnumber10主鍵,自增產(chǎn)品idcodevarchar230not null產(chǎn)品編碼namevarchar230產(chǎn)品名稱unitPricenumber10產(chǎn)品單價(jià)specvarchar2300規(guī)格unitsvarchar210單位statenumber2外鍵,not null狀態(tài)編號(hào)manufacturervarchar220生產(chǎn)商createDatedatenot null創(chuàng)建日期modifyDatedate修改日期93設(shè)計(jì)數(shù)據(jù)庫(kù)DHD表(訂貨單)字段名稱數(shù)據(jù)類型長(zhǎng)度約束描述idnumber10主鍵,自增訂貨單idhandlevarchar250not null經(jīng)手人customerIdnumber10
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 課題申報(bào)參考:健康中國(guó)視域下醫(yī)療、醫(yī)保、醫(yī)藥協(xié)同發(fā)展研究
- 二零二五版房屋互換及社區(qū)活動(dòng)組織服務(wù)協(xié)議3篇
- 2025年度農(nóng)業(yè)用地承包經(jīng)營(yíng)權(quán)登記合同參考4篇
- 2025年版?zhèn)€人與投資公司信貸合作借款合同樣本4篇
- 二零二五版木工支模與智能家居安裝服務(wù)合同4篇
- 二零二五版智能家居產(chǎn)業(yè)股權(quán)投資及合作生產(chǎn)合同3篇
- 二零二五年度廚房設(shè)備節(jié)能改造與評(píng)估合同8篇
- 2025年度個(gè)人與個(gè)人草原生態(tài)補(bǔ)償資金管理合同范本4篇
- 2025年新型建筑材料采購(gòu)及安裝施工合同3篇
- 二零二五年度品牌產(chǎn)品售后服務(wù)客戶關(guān)系維護(hù)合同3篇
- GB/T 16895.3-2024低壓電氣裝置第5-54部分:電氣設(shè)備的選擇和安裝接地配置和保護(hù)導(dǎo)體
- 計(jì)劃合同部部長(zhǎng)述職報(bào)告范文
- 人教版高一地理必修一期末試卷
- GJB9001C質(zhì)量管理體系要求-培訓(xùn)專題培訓(xùn)課件
- 《呼吸衰竭的治療》
- 2024年度醫(yī)患溝通課件
- 2024年中考政治總復(fù)習(xí)初中道德與法治知識(shí)點(diǎn)總結(jié)(重點(diǎn)標(biāo)記版)
- 2024年手術(shù)室的應(yīng)急預(yù)案
- 五年級(jí)上冊(cè)小數(shù)除法豎式計(jì)算練習(xí)300題及答案
- 語(yǔ)言規(guī)劃講義
- 生活用房設(shè)施施工方案模板
評(píng)論
0/150
提交評(píng)論