ORACLE深入淺出中級篇_第1頁
ORACLE深入淺出中級篇_第2頁
ORACLE深入淺出中級篇_第3頁
ORACLE深入淺出中級篇_第4頁
ORACLE深入淺出中級篇_第5頁
已閱讀5頁,還剩88頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

ORACL深入淺出主講人:鄒振興1第一章事務(wù)與鎖什么是事務(wù)?如何Oracle使用事務(wù)。在Java中使用事務(wù)。什么是鎖?演示更新丟失的問題。鎖的分類。阻塞與死鎖。2什么是事務(wù)什么是事務(wù)?事務(wù)是一種機(jī)制,這種機(jī)制能保證在事務(wù)內(nèi)的DML(數(shù)據(jù)操作語句)做為一個不可分割的單元進(jìn)行執(zhí)行。舉例說明事務(wù)。演示sqlservert2005事務(wù)處理。演示Oracle事務(wù)處理。事務(wù)四大特性(ACID)原子性(A)一致性(C)隔離性(I)永久性(D)3什么是事務(wù)事務(wù)處理的兩種方式顯示事務(wù):用戶通過編碼方式開啟事務(wù)隱式事務(wù):數(shù)據(jù)庫默認(rèn)認(rèn)為所有操作都是事務(wù)比較sqlserver2005與Oracle事務(wù)處理方式的區(qū)別。4如何Oracle使用事務(wù)Oracel事務(wù)關(guān)鍵字Savepointa;設(shè)置事務(wù)保存點(diǎn)Rollbacktoa;回滾到事務(wù)保存點(diǎn)a,事務(wù)不結(jié)束Commit;提交事務(wù),事務(wù)結(jié)束Rollback;回滾所有事務(wù),事務(wù)結(jié)束講解Oracel程序員一天5在JavaJdbc中使用事務(wù)演示如何在JavaJdbc中如何使用事務(wù)驅(qū)動包位置:oracle安裝路徑->oracle->jdbc->lib->classes12.jar演示案例:DBUtil.java6什么是鎖生活中的鎖:為什么會有鎖的出現(xiàn)。鎖的作用就是保護(hù)私有的空間。Oracle中的鎖:演示Oracle中更新丟失的問題。講解此問題的兩種思路:一、在第一個用戶修改之前不允許其它用戶修改。二、在修改之前,查看此數(shù)據(jù)的版本號。7鎖的分類悲觀鎖定此鎖持悲觀態(tài)度,認(rèn)為在用戶修改數(shù)據(jù)期間,一定會有用戶再對其修改。那么此鎖會在用戶事務(wù)內(nèi)一直保持鎖定狀態(tài),其它用戶無法進(jìn)行修改。在查詢語句后接forupdatenowait此可加鎖。查詢多少數(shù)據(jù),鎖定多少數(shù)據(jù)。樂觀鎖定此鎖持樂觀態(tài)度,認(rèn)為在用戶修改數(shù)據(jù)期間,其它用戶不會再對其修改,直到最后提交數(shù)據(jù)時才判斷數(shù)據(jù)是否已更改。8鎖的分類樂觀鎖定的實(shí)現(xiàn)方式:增加標(biāo)識列來區(qū)分是否已修改通過OracleORA_ROWSCN機(jī)制來實(shí)現(xiàn)樂觀鎖定9阻塞與死鎖如果你有兩個會話,每個會話都持有另一個會話想要的資源,此時就會出現(xiàn)死鎖(deadlock)。例如,如果我的數(shù)據(jù)庫中有兩個表A和B,每個表中都只有一行,就可以很容易地展示什么是死鎖。我要做的只是打開兩個會話(例如,兩個SQL*Plus會話)。在會話A中更新表A,并在會話B中更新表B?,F(xiàn)在,如果我想在會話B中更新表A,就會阻塞。會話A已經(jīng)鎖定了這一行。這不是死鎖;只是阻塞而已。我還沒有遇到過死鎖,因?yàn)闀扐還有機(jī)會提交或回滾,這樣會話B就能繼續(xù)。10阻塞與死死鎖如果我再再回到會會話A,,試圖更更新表B,這就就會導(dǎo)致致一個死死鎖。要要在這兩兩個會話話中選擇擇一個作作為“犧犧牲品””,讓它它的語句句回滾。。例如,,會話B中對對表A的的更新新可能回回滾,得得到以下下錯誤::想要更更新表B的會會話A還還阻塞塞著,Oracle不不會回回滾整個個事務(wù)。。只會回回滾與死死鎖有關(guān)關(guān)的某條條語句。。會話B仍然然鎖定著著表B中中的行行,而會會話A還還在耐耐心地等等待這一一行可用用。收到到死鎖消消息后,,會話B必須須決定將將表B上上未執(zhí)執(zhí)行的工工作提交交還是回回滾,或或者繼續(xù)續(xù)走另一一條路,,以后再再提交。。一旦這這個會話話執(zhí)行提提交或回回滾,另另一個阻阻塞的會會話就會會繼續(xù),,好像什什么也沒沒有發(fā)生生過一樣樣。11總結(jié)開發(fā)多用用戶、數(shù)數(shù)據(jù)庫驅(qū)驅(qū)動的應(yīng)應(yīng)用時,,最大的的難點(diǎn)之之一是::一方面面要力爭爭取得最最大限度度的并發(fā)發(fā)訪問,,與此同同時還要要確保每每個用戶戶能以一一致的方方式讀取取和修改改數(shù)據(jù)。。為此就就有了鎖鎖定(locking)機(jī)制制,這也也是所有有數(shù)據(jù)庫庫都具有有的一個個關(guān)鍵特特性,Oracle在在這方方面更是是技高一一籌。不不過,Oracle的的這些些特性的的實(shí)現(xiàn)是是Oracle所特有有的,就就像SQLServer的的實(shí)現(xiàn)現(xiàn)只是SQLServer特有有的一樣樣,應(yīng)用用執(zhí)行數(shù)數(shù)據(jù)處理理時,要要正確地地使用這這些機(jī)制制,而這這一點(diǎn)要要由你((應(yīng)用的的開發(fā)人人員)來來保證。。12第五章使使用PL/SQLPL/SQL簡簡介變量、常常量數(shù)據(jù)類型型流程控制制異常處理理13PL/SQL簡簡介PL/SQL是是Oracle在sql標(biāo)準(zhǔn)準(zhǔn)上的加加強(qiáng),使使用Oracle能夠夠基于對對象編程程T-SQL是基基于事務(wù)務(wù)的結(jié)構(gòu)構(gòu)化查詢詢語言兩者都是是對SQL的擴(kuò)擴(kuò)展14PL/SQL塊塊簡介PL/SQL塊塊是構(gòu)構(gòu)成PL/SQL程程序的的基本組組織單元元,可以以編寫存存儲過程程、函數(shù)數(shù)、包、、觸發(fā)器器等。PL/SQL分分為三三個部分分:聲明明部分、、可執(zhí)行行部分和和異常處處理部分分15PL/SQL塊塊簡介演示:PL/SQL打印HelloWorld。演示:如何在在PL/SQL塊中向向表中增增加一條條記錄。。演示:如何在在PL/SQL塊中修修改表中中數(shù)據(jù)。。演示:查詢學(xué)學(xué)員'張張秋麗'的年齡齡。16PL/SQL塊塊小結(jié)結(jié)每一個PL/SQL塊塊將會自自動開啟啟一個事事務(wù),在在PL/SQL塊中必必須結(jié)束束事務(wù),,否則,,將會阻阻塞。PL/SQL塊塊每條語語句后,,必須帶帶上’;’,表表示語句句結(jié)束。。PL/SQL塊塊中不能能執(zhí)行select語語句進(jìn)行行顯示。。在命令行行中執(zhí)行行pl-sql塊需加加/。在命令行行中打印印變量需需setserverouton;17變量與常常量在PL/SQL塊的聲聲明部分分聲明變變量或常常量語法法::declaresalnumber;piconstantnumber:=3.14;賦值值1、、使使用用賦賦值值運(yùn)運(yùn)算算符符““:=””2、使用SELECTINTO語句3、接收用戶戶輸入18變量與常量示示例Declaremynamevarchar2(20)notnull:=‘張三’;myagenumber;mypiconstantnumber:=3.14;Beginmyage:=26;selectenameintomynamefromempwhereempno=7369;--輸出End;19日期時間日期時間類型型存儲日期和時時間數(shù)據(jù)常用的兩種日日期時間類型型DATETIMESTAMPdeclaremydatedate;mytimetimestamp;beginselectsysdateintomydatefromdual;selectsysdateintomytimefromdual;dbms_output.put_line(mydate);dbms_output.put_line(mytime);end;20布爾類型(boolean)用于存儲邏輯輯值(TRUE、FALSE和NULL)不能向數(shù)據(jù)庫庫中插入BOOLEAN數(shù)據(jù)不能將列值保保存到BOOLEAN變變量中只能對BOOLEAN變變量執(zhí)行邏輯輯操作21屬性類型用于引用數(shù)據(jù)據(jù)庫列的數(shù)據(jù)據(jù)類型,以及及表示表中一一行的記錄類類型列類型%type,語法法:表名.列名%type行類型%rowtype,語法:表表名%rowtype優(yōu)點(diǎn)不需要知道被被引用的表列列的具體類型型如果被引用對對象的數(shù)據(jù)類類型發(fā)生改變變,PL/SQL變量量的數(shù)據(jù)類型型也隨之改變變22屬性類型示例例問題1:假設(shè)設(shè)現(xiàn)在不知道道emp表Job列的類類型,但要保保存員工7369的崗位位到變量中,,如何定義??declaremyjobemp.Job%type;beginselectJobintomyjobfromempwhereempno=7369;dbms_output.put_line(myjob);end;23屬性類型示例例問題2:假設(shè)設(shè)要輸出emp表員工7369的所所有信息,怎怎么辦?定義義8個列類型型變量,依次次輸出?declaremyempemp%rowtype;beginselect*intomyempfromempwhereempno=7369;dbms_output.put_line(myemp.ename||myemp.job);end;24異常處處理在運(yùn)行行程序序時出出現(xiàn)的的錯誤誤叫做做異常常發(fā)生異異常后后,語語句將將停止止執(zhí)行行,控控制權(quán)權(quán)轉(zhuǎn)移移到PL/SQL塊塊的異異常處處理部部分異常有有兩種種類型型:預(yù)定義義異常常-當(dāng)當(dāng)PL/SQL程程序違違反Oracle規(guī)規(guī)則或或超越越系統(tǒng)統(tǒng)限制制時隱隱式引引發(fā)用戶定定義異異常-用用戶戶可以以在PL/SQL塊塊的聲聲明部部分定定義異異常,,自定定義的的異常常通過過RAISE語語句顯顯式引引發(fā)25預(yù)定義義異常常Others處處理理所有有異常常在用戶戶試圖圖將重重復(fù)的的值存存儲在在使用用唯一一索引引的數(shù)數(shù)據(jù)庫庫列中中時出出現(xiàn)DUP_VAL_ON_INDEX在將字字符串串轉(zhuǎn)換換為數(shù)數(shù)字時時出現(xiàn)現(xiàn)INVALID_NUMBER在表中中不存存在請請求的的行時時出現(xiàn)現(xiàn)NO_DATA_FOUND在執(zhí)行SELECTINTO語句句后返回回多行時時出現(xiàn)TOO_MANY_ROWS在以零作作為除數(shù)數(shù)時出現(xiàn)現(xiàn)ZERO_DIVIDE26預(yù)定義異異常declaremynameemp.ename%type;beginselectenameintomynamefromemp;Exceptionwhentoo_many_rowsthendbms_output.put_line('值過多多');end;27預(yù)定義異常常declaremynameemp.ename%type;beginselectenameintomynamefromempwhereempno=1;Exceptionwhenno_data_foundthendbms_output.put_line('沒有數(shù)數(shù)據(jù)');end;28用戶自定義義異常declaremyExceptionException;beginif...thenraisemyException;endif;ExceptionwhenmyExceptionthen...end;29流程控制條件結(jié)構(gòu)If語句Case語語句循環(huán)結(jié)構(gòu)Loop循循環(huán)While循環(huán)For循環(huán)環(huán)30條件結(jié)構(gòu)1)if...then...endif;2)if...then...elseif...endif…….endif;嵌嵌套if3)if...then...elsif...then...else...endif;多多重if4)case...when...endcase;編寫一一個PL/SQL塊塊,用用戶輸輸入一一個員員工名名,如如果該該員工工的工工資低低于2000,,則將將該員員工工工資增增長10%。31接收用用戶輸輸入的的兩個個數(shù),,通過過條件件結(jié)構(gòu)構(gòu)判斷斷兩個個數(shù)的的關(guān)系系declarenum1number;num2number;beginnum1:=‘‘&請請輸入入一個個數(shù)’’;num2:='&num2';--接接收用用戶輸輸入'&name'ifnum1<num2thendbms_output.put_line('小小于');elsifnum1>num2thendbms_output.put_line('大大于');elsedbms_output.put_line('等等于');endif;end;32declaregradevarchar2(10);begingrade:='&grade';casegradewhen'A'thendbms_output.put_line('優(yōu)優(yōu)秀');when'B'thendbms_output.put_line('良良好');when'C'thendbms_output.put_line('一一般');when'D'thendbms_output.put_line('差差');elsedbms_output.put_line('沒這這個');endcase;end;33循環(huán)結(jié)結(jié)構(gòu)使用三三種循循環(huán)實(shí)實(shí)現(xiàn)輸輸出100次我我愛你你341)無無條件件(無無限))循環(huán)環(huán)--跳跳出循循環(huán)exit,exitwhen...declarecounternumber:=0;beginloopcounter:=counter+1;dbms_output.put_line(counter||':我我愛你你');--ifcounter=100then--exit;--退退出循循環(huán)--endif;exitwhencounter=100;endloop;end;352)有有條件件循環(huán)環(huán)declarecounternumber:=0;beginwhile(counter<100)loopcounter:=counter+1;dbms_output.put_line(counter||':我我愛你你');endloop;end;363)循循環(huán)固固定次次數(shù):數(shù)字字區(qū)間間:下下限..上上限beginfornumin1..100loopdbms_output.put_line(num||':我我愛你你');endloop;end;37動態(tài)SQL應(yīng)用::1、DDL語語句命命令和和會話話控制制語句句不能能在PL/SQL中中直接接使用用,但但是可可以通通過動動態(tài)SQL來來執(zhí)執(zhí)行2、在在運(yùn)行行時,,根據(jù)據(jù)需要要動態(tài)態(tài)構(gòu)建建SQL語語句執(zhí)執(zhí)行38動態(tài)SQL動態(tài)SQL是是指指在PL/SQL程程序執(zhí)執(zhí)行時時生成成的SQL語語句句編譯程程序?qū)討B(tài)態(tài)SQL不不做處處理,,而是是在程程序運(yùn)運(yùn)行時時動態(tài)態(tài)構(gòu)造造語句句、對對語句句進(jìn)行行語法法分析析并執(zhí)執(zhí)行執(zhí)行語語法::executeimmediate'sql語語句'[into變變量列列表]--將查查詢的的值賦賦值給給變量量[using參參數(shù)數(shù)列表表]--使使用參參數(shù)填填補(bǔ)占占位符符(:name)39Eg::利用用動態(tài)態(tài)SQL建建表beginexecuteimmediate'createtabletest(tidnumber)';end;問題:能能否建表表后執(zhí)行行插入數(shù)數(shù)據(jù)操作作?40Eg:根根據(jù)員工工編號獲獲得員工工姓名declaremynameemp.ename%type;beginexecuteimmediate'selectenamefromempwhereempno=:no'intomynameusing'&no';dbms_output.put_line(myname);end;問題:如如果Sql語句句有多個個條件怎怎么寫??41總結(jié)1、:=賦值運(yùn)運(yùn)算符2、||連接操操作符3、'&name'接接受用戶戶輸入?yún)?shù)值4、:name動態(tài)態(tài)SQL中占位位符,使使用using填補(bǔ)42第六章游游標(biāo)管管理什么是游游標(biāo)顯示游標(biāo)標(biāo)的使用用游標(biāo)類型型的使用用隱式游標(biāo)標(biāo)的使用用43什么是游游標(biāo)提問:請請編寫pl-sql塊塊,打印印出所有有的參加加考試的的學(xué)員信信息。分析問題題:pl-sql塊中中無法使使用select語句句,使用用變量也也無法保保存多行行數(shù)據(jù)。。解決問題題:要是是Oracle提供類類似于Java集合的的結(jié)構(gòu)就就能輕松松解決問問題。44顯示游標(biāo)標(biāo)1顯式游標(biāo)標(biāo)在PL/SQL塊塊的聲聲明部分分定義查查詢,該該查詢可可以返回多行行顯式游標(biāo)標(biāo)的操作作過程::數(shù)據(jù)庫打開游標(biāo)標(biāo)30George344Roger245James1Stud_mrksStud_namestud_no提取行變量關(guān)閉游標(biāo)標(biāo)45顯示游標(biāo)標(biāo)2定義:CURSOR<游標(biāo)標(biāo)名>IS<SELECT語語句>[FORUPDATE|FORUPDATEOF字字段];操作:OPEN<游游標(biāo)名>;--打開開游標(biāo)FETCH<游標(biāo)名名>INTO變量量1,變變量2,變量3,....變變量n;或或者FETCH<游標(biāo)名名>INTO行對對象;--取出出游標(biāo)當(dāng)當(dāng)前位置置的值CLOSE<游標(biāo)名名>;--關(guān)關(guān)閉游標(biāo)標(biāo)46顯示游標(biāo)標(biāo)屬性%NOTFOUND--如如果FETCH語句失失敗,則則該屬性性為"TRUE",否否則為"FALSE";%FOUND--如如果FETCH語句成成功,則則該屬性性為"TRUE",否否則為"FALSE";%ROWCOUNT--返返回游標(biāo)標(biāo)當(dāng)前的的行數(shù);%ISOPEN--如果游游標(biāo)是開開的則返返回"TRUE",否否則為"FALSE";47輸出所有有員工編編號與姓姓名declarerowempemp%rowtype;--行行變量cursorempcurisselect*fromemp;--定義義游標(biāo)beginopenempcur;--打開開游標(biāo)loopfetchempcurintorowemp;dbms_output.put_line(rowemp.empno||rowemp.ename);exitwhenempcur%notfound;endloop;closeempcur;--關(guān)關(guān)閉游標(biāo)標(biāo)end;48For循循環(huán)游標(biāo)標(biāo)循環(huán)游標(biāo)標(biāo)用于簡簡化游標(biāo)標(biāo)處理代代碼自動打開開游標(biāo),,提取記記錄,關(guān)關(guān)閉游標(biāo)標(biāo)當(dāng)用戶需需要從游游標(biāo)中提提取所有有記錄時時使用循環(huán)游標(biāo)標(biāo)的語法法如下::FOR<record_index>IN<cursor_name>LOOP<executablestatements>ENDLOOP;<record_index>是類類型為%rowtype的記記錄變量量使用游標(biāo)標(biāo)for循環(huán)的的時候不不能使用用open語句句,fetch語句和和close語語句,否則會產(chǎn)生生錯誤。49輸出所有員員工編號與與姓名declarecursorempcurisselect*fromemp;--定定義游標(biāo)beginforrowempinempcurloopdbms_output.put_line(rowemp.empno||rowemp.ename);endloop;end;50帶參數(shù)的游游標(biāo)提高游標(biāo)的的靈活性語法:CURSOR<游游標(biāo)名>(參數(shù)列表表)IS<SELECT語句>;51根據(jù)部門編編號輸出該該部門員工工姓名declarecursorempcur(dtnoemp.deptno%type)isselect*fromempwheredeptno=dtno;--定義游游標(biāo)beginforrowempinempcur(20)loopdbms_output.put_line(rowemp.ename);endloop;end;52游標(biāo)加鎖[FORUPDATE|FORUPDATEOF字字段]即在程中有有“UPDATE””,“INSERT”,“DELETE”語句句對數(shù)據(jù)庫庫操作時,,游標(biāo)自動動給指定的的表或者字字段加鎖,,防止同時時有別的程程序?qū)χ付ǘǖ谋砘蜃肿侄芜M(jìn)行““UPDATE”,“INSERT””,“DELETE”操作。。在使用“DELETE”,““UPDATE”后后還可以在在程序中使使用CURRENTOF<游標(biāo)名名>子句句引用當(dāng)前前行進(jìn)行更更新操作。53使用游標(biāo)更更新工資,,翻倍declarecursormycursorisselectsalfromempforupdate;beginforrinmycursorloopupdateempsetsal=sal*2wherecurrentofmycursor;endloop;end;54REF游標(biāo)標(biāo)與游標(biāo)變變量REF游游標(biāo)和游標(biāo)標(biāo)變量用于于處理運(yùn)行行時動態(tài)執(zhí)執(zhí)行的SQL查查詢創(chuàng)建游標(biāo)變變量需要兩兩個步驟::聲明REF游標(biāo)標(biāo)類型聲明REF游標(biāo)標(biāo)類型的變變量用于聲明REF游游標(biāo)類型型的語法為為:TYPE<ref_cursor_name>ISREFCURSOR[RETURN<return_type>];打開游標(biāo)變變量的語法法如下:OPENcursor_nameFORselect_statement;55獲取部門10的工資資declareTypesalcursorisrefcursor;--聲明明游標(biāo)類型型salcurvarsalcursor;--定義游游標(biāo)變量mysalnumber;beginopensalcurvarforselectsalfrommyempwheredeptno=10;loopfetchsalcurvarintomysal;dbms_output.put_line(mysal);exitwhensalcurvar%notfound;endloop;end;56游標(biāo)變量優(yōu)點(diǎn)點(diǎn)游標(biāo)變量的功功能強(qiáng)大,可可以簡化數(shù)據(jù)據(jù)處理。游標(biāo)變量的優(yōu)優(yōu)點(diǎn)有:可從不同的SELECT語句中中提取結(jié)果集集可以作為過程程的參數(shù)進(jìn)行行傳遞可以引用游標(biāo)標(biāo)的所有屬性性可以進(jìn)行賦值值運(yùn)算57使用游標(biāo)變量量執(zhí)行動態(tài)SqldeclareTypesalcursorisrefcursor;--聲明游標(biāo)類類型salcurvarsalcursor;--定義游標(biāo)標(biāo)變量mysalnumber;beginopensalcurvarfor'selectsalfrommyempwheredeptno=:dno'--動態(tài)SQL字符串串using‘‘&no’’;--填補(bǔ)補(bǔ)占位符的參參數(shù)loopfetchsalcurvarintomysal;dbms_output.put_line(mysal);exitwhensalcurvar%notfound;endloop;end;58隱式游標(biāo)在PL/SQL中使用DML語句時自動創(chuàng)建隱式式游標(biāo)隱式游標(biāo)自動動聲明、打開開和關(guān)閉,其其游標(biāo)名稱為為SQL通過檢查隱式式游標(biāo)的屬性性可以獲得最最近執(zhí)行的DML語句句的信息59隱式游游標(biāo)屬屬性%NOTFOUND--如如果DML語句句沒有有影響響到任任何行行時,,則該該屬性性為"TRUE",,否則則為"FALSE";%FOUND--如果果DML語語句影影響到到一行行或多多行時時,則則該屬屬性為為"TRUE",否否則為為"FALSE";%ROWCOUNT--返返回DML語句句影響響的行行數(shù);%ISOPEN-游游標(biāo)標(biāo)是否否打開開,隱隱式游游標(biāo)始始終為為FALSE使用::游標(biāo)標(biāo)名稱稱+屬屬性SQL%NOTFOUND60隱式游游標(biāo)屬屬性beginupdateempsetcomm=100whereempno=7369;ifSQL%Found=truethendbms_output.put_line('更更新成成功');dbms_output.put_line('受受影響響的行行數(shù)'||SQl%rowcount);endif;IfSQL%NotFound=truethendbms_output.put_line(‘不不存在在');endif;end;61總結(jié)游標(biāo)用用于處處理查查詢結(jié)結(jié)果集集中的的數(shù)據(jù)據(jù)游標(biāo)類類型有有:隱隱式游游標(biāo)、、顯式式游標(biāo)標(biāo)和REF游游標(biāo)標(biāo)隱式游游標(biāo)由由PL/SQL自自動動定義義、打打開和和關(guān)閉閉顯式游游標(biāo)用用于處處理返返回多多行的的查詢詢在聲明明REF游游標(biāo)時時,不不需要要將SELECT語語句與與其其關(guān)聯(lián)聯(lián)62第七章章子子程序序與程程序包包什么是是子程程序子程序序一::存儲儲過程程子程序序二::函數(shù)數(shù)子程序序三::自主主事務(wù)務(wù)處理理組織子子程序序:程程序包包63子程序序1命名的的PL/SQL塊塊,,編譯譯并存存儲在在數(shù)據(jù)據(jù)庫中中。子程序序的各各個部部分::聲明部部分可執(zhí)行行部分分異常處處理部部分(可選選)子程序序的分分類::過程--執(zhí)執(zhí)行行某些些操作作函數(shù)--執(zhí)執(zhí)行行操作作并返返回值值64子程序序2子程序序的優(yōu)優(yōu)點(diǎn)::模塊化化將程序序分解解為邏邏輯模模塊可重用用性可以被被任意意數(shù)目目的程程序調(diào)調(diào)用可維護(hù)護(hù)性簡化維維護(hù)操操作安全性性通過設(shè)設(shè)置權(quán)權(quán)限,,使數(shù)數(shù)據(jù)更更安全全65子程序序一::存儲儲過程程過程是是用于于完成成特定定任務(wù)務(wù)的子子程序序例如:前往售票廳廳詢問關(guān)于車車票的信息息排隊等候在柜臺購買買車票66子程序一::存儲過程程創(chuàng)建簡單過過程createorreplaceprocedureSayHiasbegindbms_output.put_line('hi');end;67子程序一::存儲過程程調(diào)用--1、在在命令窗口口下executeSayHi;--2、在在SQLWindow下beginSayHi();end;68子程序一::存儲過程程帶參數(shù)過程程,參數(shù)不不用指定長長度createorreplaceprocedureSayHi(strvarchar2)asbegindbms_output.put_line(str);end;69子程序一::存儲過程程根據(jù)員工編編號查詢員員工姓名,,并打印,,沒找到數(shù)數(shù)據(jù)則異常常處理createorreplaceprocedureSearchName(emp_nonumber)isempnamevarchar(20);beginselectenameintoempnamefromempwhereempno=emp_no;dbms_output.put_line(empname);end;70子程序一:存存儲過程過程參數(shù)的三三種模式:IN用于接受調(diào)用用程序的值默認(rèn)的參數(shù)模模式OUT用于向調(diào)用程程序返回值INOUT用于接受調(diào)用用程序的值,,并向調(diào)用程程序返回更新新的值71子程序一::存儲過程程根據(jù)員工編編號返回員員工姓名給給另一程序序createorreplaceprocedureSearchName(emp_noinnumber,empnameoutvarchar2)isbeginselectenameintoempnamefromempwhereempno=emp_no;end;72子程序一::存儲過程程declareemp_nonumber;empnamevarchar2(20);beginemp_no:='&no';SearchName(emp_no,empname);dbms_output.put_line(empname);end;73子程序一::存儲過程程交換兩個數(shù)數(shù)createorreplaceprocedureSwap(num1inoutnumber,num2inoutnumber)istempnumber;begintemp:=num1;num1:=num2;num2:=temp;end;74子程序一::存儲過程程declarenum1number:=10;num2number:=20;begindbms_output.put_line('num1='||num1);dbms_output.put_line('num2='||num2);Swap(num1,num2);dbms_output.put_line('調(diào)用過過程后');dbms_output.put_line('num1='||num1);dbms_output.put_line('num2='||num2);end;75子程序一::存儲過程程--返返回回游游標(biāo)標(biāo)的的存存儲儲過過程程createorreplaceproceduregetAllEmp(returnCursoroutsys_refcursor)asbeginopenreturnCursorforselect*fromemp;end;--使使用用存存儲儲過過程程返返回回的的游游標(biāo)標(biāo)declaretypeclasscursorisrefcursor;mycursorclasscursor;var_empemp%rowtype;begingetAllEmp(returnCursor=>mycursor);loopfetchmycursorintovar_emp;dbms_output.put_line(var_emp.ename);exitwhenmycursor%notfound;endloop;end;76子程程序序一一::存存儲儲過過程程創(chuàng)建建過過程程的的語語法法::create[orreplace]procedure過程程名名稱稱[(參參數(shù)數(shù)列列表表)]is|as[變變量量]begin可執(zhí)執(zhí)行行部部分分;[Exception]end;77子程程序序一一::存存儲儲過過程程使用用Java程程序序調(diào)調(diào)用用幾幾種種存存儲儲過過程程。。Test.java78子程程序序二二::函函數(shù)數(shù)(function)函數(shù)數(shù)是是可可以以返返回回值值的的命命名名的的PL/SQL子子程程序序。。參數(shù)數(shù)與與返返回回值值類類型型不不用用指指定定長長度度79子程程序序二二::函函數(shù)數(shù)簡單單函函數(shù)數(shù)createorreplacefunctionFSayHireturnvarchar2isbeginreturn'Hi';end;80子程序二二:函數(shù)數(shù)調(diào)用函數(shù)數(shù)1、結(jié)合合查詢selectFSayHifromdual;2、返回回值給變變量declarestrvarchar2(20);beginstr:=FSayHi;dbms_output.put_line(str);end;81子程序二二:函數(shù)數(shù)帶參函數(shù)數(shù)createorreplacefunctionFSayHi(strvarchar2)returnvarchar2isbeginreturnstr;end;selectFSayHi('大大家好')fromdual;82子程序二二:函數(shù)數(shù)--通過過員工編編號返回回員工姓姓名createorreplacefunctionFSearchName(emp_nonumber)returnvarchar2isempnamevarchar2(20);beginselectenameintoempnamefromempwhereempno=emp_no;returnempname;end;selectFSearchName(7369)fromdual;83子程序二二:函數(shù)數(shù)創(chuàng)建函數(shù)數(shù)語法create[orreplace]function函數(shù)名稱稱[(參參數(shù)列表表)]returnis|asbegin可執(zhí)行部部分;[Exception]end;84子程序二二:函數(shù)數(shù)刪除過程程與函數(shù)數(shù)dropprocedure過過程名;dropfunction函數(shù)數(shù)名;授予其他他用戶執(zhí)執(zhí)行子程程序的權(quán)權(quán)限grantexecuteon子程程序名to用用戶名名;85過程與函函數(shù)比較較過程函數(shù)作為PL/SQL語句執(zhí)行作為表達(dá)式的一部分調(diào)用在規(guī)格說明中不包含RETURN子句必須在規(guī)格說明中包含RETURN子句不返回任何值必須返回單個值可以包含RETURN語句,但是與函數(shù)不同,它不能用于返回值必須包含至少一條RETURN

語句86子程序三三:自主主事務(wù)處處理自主事務(wù)務(wù)處理主事務(wù)處處理啟動動獨(dú)立事事務(wù)處理理然后主事事務(wù)處理理被暫停停自主事務(wù)務(wù)處理子子程序內(nèi)內(nèi)的SQL操操作然后終止止自主事事務(wù)處理理恢復(fù)主事事務(wù)處理理PRAGMAAUTONOMOUS_TRANSACTION用用于標(biāo)標(biāo)記子程程序?yàn)樽宰灾魇聞?wù)務(wù)處理87子程序三三:自主主事務(wù)處處理自主事務(wù)務(wù)處理測測試:創(chuàng)建過程1,執(zhí)行刪刪除員工7369操操作,并回回滾創(chuàng)建過程2,執(zhí)行刪刪除員工7499操操作,并調(diào)調(diào)用過程1創(chuàng)建程序調(diào)調(diào)用過程2問哪個刪除除操作會回回滾?88子程序三::自主事務(wù)務(wù)處理createorreplaceproceduretestp1is--pragmaautonomous_transaction;--標(biāo)識子子程序?yàn)樽宰灾魇聞?wù)處處理begindelete

溫馨提示

  • 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

提交評論