精通Oracle核心技術(shù)和項(xiàng)目實(shí)戰(zhàn)之存儲(chǔ)過程課件_第1頁(yè)
精通Oracle核心技術(shù)和項(xiàng)目實(shí)戰(zhàn)之存儲(chǔ)過程課件_第2頁(yè)
精通Oracle核心技術(shù)和項(xiàng)目實(shí)戰(zhàn)之存儲(chǔ)過程課件_第3頁(yè)
精通Oracle核心技術(shù)和項(xiàng)目實(shí)戰(zhàn)之存儲(chǔ)過程課件_第4頁(yè)
精通Oracle核心技術(shù)和項(xiàng)目實(shí)戰(zhàn)之存儲(chǔ)過程課件_第5頁(yè)
已閱讀5頁(yè),還剩59頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第14章存儲(chǔ)過程前面章節(jié)中講解了PL/SQL有關(guān)的內(nèi)容。事實(shí)上,PL/SQL主要包括匿名塊、存儲(chǔ)過程和存儲(chǔ)函數(shù)三種形式的PL/SQL塊。存儲(chǔ)過程是一段存儲(chǔ)在數(shù)據(jù)庫(kù)中執(zhí)行某功能的程序。使用存儲(chǔ)過程可以方便用戶使用數(shù)據(jù)庫(kù)中的應(yīng)用程序。本章重點(diǎn)介紹如何創(chuàng)建存儲(chǔ)過程以及如何在PL/SQL塊中使用過程訪問數(shù)據(jù)庫(kù)中的數(shù)據(jù)。第14章存儲(chǔ)過程前面章節(jié)中講解了PL/SQL有關(guān)的內(nèi)容。114.1存儲(chǔ)過程簡(jiǎn)介在PL/SQL塊中常把一些功能相對(duì)獨(dú)立、需要經(jīng)常執(zhí)行的代碼定義為一個(gè)子程序,在需要時(shí)可以根據(jù)子程序的名字進(jìn)行調(diào)用,從而簡(jiǎn)化操作。這樣不僅便于程序設(shè)計(jì),而且有利于程序的調(diào)試。與其他PL/SQL塊一樣,在子程序中也可以定義變量、類型、游標(biāo)等,同樣可以進(jìn)行異常處理操作。需要注意的是有時(shí)必須向子程序提供參數(shù)(向子程序傳遞參數(shù))。PL/SQL的子程序有兩種形式,即過程和函數(shù)。過程與函數(shù)的區(qū)別在于函數(shù)有返回值,可以向調(diào)用者返回執(zhí)行結(jié)果,而過程沒有返回值。14.1存儲(chǔ)過程簡(jiǎn)介在PL/SQL塊中常把一些功能相對(duì)214.1.1認(rèn)識(shí)存儲(chǔ)過程在Oracle數(shù)據(jù)庫(kù)中,可以將一些固定的操作集中起來(lái)由Oracle數(shù)據(jù)庫(kù)服務(wù)器來(lái)完成,以實(shí)現(xiàn)某個(gè)任務(wù),這就是存儲(chǔ)過程。存儲(chǔ)過程是Oracle開發(fā)者在數(shù)據(jù)轉(zhuǎn)換或查詢報(bào)表時(shí)經(jīng)常使用的方式之一。一旦在數(shù)據(jù)庫(kù)管理系統(tǒng)中創(chuàng)建了存儲(chǔ)過程對(duì)象,用戶就可以使用應(yīng)用程序,通過簡(jiǎn)單命令執(zhí)行存儲(chǔ)過程。存儲(chǔ)過程在第一次執(zhí)行時(shí),進(jìn)行語(yǔ)法檢查和編譯,執(zhí)行后,它的執(zhí)行計(jì)劃就駐留在高速緩存中,用于后續(xù)調(diào)用。存儲(chǔ)過程可以接收和輸出參數(shù),返回執(zhí)行存儲(chǔ)過程的狀態(tài)值,還可以嵌套調(diào)用。詳細(xì)內(nèi)容在下面講解。14.1.1認(rèn)識(shí)存儲(chǔ)過程在Oracle數(shù)據(jù)庫(kù)中,可以將一314.1.2存儲(chǔ)過程的作用存儲(chǔ)過程的編寫相對(duì)復(fù)雜,但是很多人都在使用它。這是因?yàn)樗兄幌盗械膬?yōu)點(diǎn)。簡(jiǎn)化復(fù)雜操作。增加數(shù)據(jù)獨(dú)立性。提高安全性。實(shí)現(xiàn)表字段完整性。14.1.2存儲(chǔ)過程的作用存儲(chǔ)過程的編寫相對(duì)復(fù)雜,但是很414.2

創(chuàng)建存儲(chǔ)過程和執(zhí)行存儲(chǔ)過程更傾向于數(shù)據(jù)庫(kù)操作。存儲(chǔ)過程的創(chuàng)建有固定的模式。我們可以使用語(yǔ)句的方法創(chuàng)建,也可以使用PL/SQL工具創(chuàng)建,本節(jié)主要學(xué)習(xí)使用語(yǔ)句的方法創(chuàng)建執(zhí)行存儲(chǔ)過程。14.2創(chuàng)建存儲(chǔ)過程和執(zhí)行存儲(chǔ)過程更傾向于數(shù)據(jù)庫(kù)操作。514.2.1創(chuàng)建存儲(chǔ)過程在PL/SQL語(yǔ)句中,可以使用createorreplaceprocedure命令創(chuàng)建用戶自定義存儲(chǔ)過程。存儲(chǔ)過程包括無(wú)參數(shù)的存儲(chǔ)過程以及各類有參數(shù)的存儲(chǔ)過程。創(chuàng)建無(wú)參數(shù)的存儲(chǔ)過程語(yǔ)法結(jié)構(gòu)如圖所示。14.2.1創(chuàng)建存儲(chǔ)過程在PL/SQL語(yǔ)句中,可以使用c614.2.1創(chuàng)建存儲(chǔ)過程1.創(chuàng)建無(wú)參數(shù)存儲(chǔ)過程無(wú)參數(shù)的存儲(chǔ)過程就是在創(chuàng)建的存儲(chǔ)過程中不帶任何參數(shù),通過這種存儲(chǔ)過程用做數(shù)據(jù)轉(zhuǎn)換的幾率比較大?!臼纠?4-1】創(chuàng)建一個(gè)簡(jiǎn)單的存儲(chǔ)過程,輸出信息“人生追求情趣,年輕追求個(gè)性?!??!臼纠?4-2】在數(shù)據(jù)表customersnew中,存儲(chǔ)了顧客信息?!臼纠?4-3】創(chuàng)建一個(gè)無(wú)參數(shù)存儲(chǔ)過程,用于修改表customersnew中列credit_limit的數(shù)據(jù),為status是“gold”的credit_limit增加10000。14.2.1創(chuàng)建存儲(chǔ)過程1.創(chuàng)建無(wú)參數(shù)存儲(chǔ)過程714.2.1創(chuàng)建存儲(chǔ)過程2.查看存儲(chǔ)過程信息存儲(chǔ)過程一旦創(chuàng)建,就存儲(chǔ)在數(shù)據(jù)庫(kù)服務(wù)器上,Oracle允許開發(fā)人員查看已經(jīng)存在的存儲(chǔ)過程腳本,這可以通過數(shù)據(jù)字典(視圖)user_objects和user_source進(jìn)行查看。當(dāng)從視圖中查詢過程時(shí),需要把名稱大寫。14.2.1創(chuàng)建存儲(chǔ)過程2.查看存儲(chǔ)過程信息814.2.1創(chuàng)建存儲(chǔ)過程(1)通過user_objects查看存儲(chǔ)過程?!臼纠?4-4】前面創(chuàng)建了創(chuàng)建一個(gè)無(wú)參數(shù)存儲(chǔ)過程pro_print,現(xiàn)在通過數(shù)據(jù)字典user_objects查看存儲(chǔ)過程信息。【示例14-5】利用user_source查看存儲(chǔ)過程pro_print的詳細(xì)信息。14.2.1創(chuàng)建存儲(chǔ)過程(1)通過user_object914.2.1創(chuàng)建存儲(chǔ)過程3.顯示存儲(chǔ)過程的錯(cuò)誤編寫存儲(chǔ)過程時(shí)由于各種原因都有可能出現(xiàn)錯(cuò)誤而導(dǎo)致過程編譯失敗,這種情況下,可以利用視圖user_errors查看具體的錯(cuò)誤提示?!臼纠?4-6】創(chuàng)建一個(gè)簡(jiǎn)單的帶有錯(cuò)誤的存儲(chǔ)過程,輸出信息“人生追求情趣,年輕追求個(gè)性?!?。【示例14-7】利用user_errors查看存儲(chǔ)過程的具體的錯(cuò)誤提示。14.2.1創(chuàng)建存儲(chǔ)過程3.顯示存儲(chǔ)過程的錯(cuò)誤1014.2.1創(chuàng)建存儲(chǔ)過程4.執(zhí)行存儲(chǔ)過程存儲(chǔ)過程一旦創(chuàng)建,便可以被其他用戶調(diào)用。執(zhí)行存儲(chǔ)過程非常簡(jiǎn)單。當(dāng)處于PL/SQL代碼塊中時(shí),可以直接利用存儲(chǔ)過程名稱來(lái)調(diào)用和執(zhí)行存儲(chǔ)過程如下所示?!臼纠?4-8】調(diào)用和執(zhí)行存儲(chǔ)過程pro_print?!臼纠?4-9】使用execute命令調(diào)用存儲(chǔ)過程pro_credit。14.2.1創(chuàng)建存儲(chǔ)過程4.執(zhí)行存儲(chǔ)過程1114.2.2有參數(shù)的存儲(chǔ)過程無(wú)參數(shù)的存儲(chǔ)過程不會(huì)接受參數(shù)的傳入和傳出,是針對(duì)表或者視圖的查詢或者刪除操作,適合進(jìn)行數(shù)據(jù)的轉(zhuǎn)換操作。但是存儲(chǔ)過程可以帶參數(shù),實(shí)現(xiàn)特定的功能。參數(shù)的使用將增加存儲(chǔ)過程的靈活性,給數(shù)據(jù)庫(kù)編程帶來(lái)極大的方便。14.2.2有參數(shù)的存儲(chǔ)過程無(wú)參數(shù)的存儲(chǔ)過程不會(huì)接受參數(shù)1214.2.2有參數(shù)的存儲(chǔ)過程存儲(chǔ)過程的參數(shù)有三種:in(輸入類型)參數(shù)、out(輸出類型)參數(shù)和inout(輸入輸出類型)參數(shù)。在過程中可以定義參數(shù),在調(diào)用該過程時(shí),可以向過程傳遞實(shí)際參數(shù)。如果沒有參數(shù),則過程名后面的圓括號(hào)及參數(shù)列表可以省略。參數(shù)的定義形式如圖所示。14.2.2有參數(shù)的存儲(chǔ)過程存儲(chǔ)過程的參數(shù)有三種:in(1314.2.2有參數(shù)的存儲(chǔ)過程三種參數(shù)傳遞模式的比較如表所示。參數(shù)默認(rèn)值的作用是在調(diào)用過程時(shí),如果沒有提供實(shí)際參數(shù),則將此默認(rèn)值作為實(shí)際參數(shù)傳遞給過程。數(shù)據(jù)類型用來(lái)指定參數(shù)的類型,在參數(shù)定義中不能指定對(duì)參數(shù)的約束條件,即不能指定參數(shù)的長(zhǎng)度和是否為空等屬性。

inoutinout是否默認(rèn)默認(rèn)必須明確指定必須明確指定參數(shù)傳遞方向從調(diào)用者到過程從過程到調(diào)用者兩個(gè)方向形式參數(shù)的作用一個(gè)常量沒有初始化的變量經(jīng)過初始化的變量實(shí)際參數(shù)的形式常量、表達(dá)式、變量必須是一個(gè)變量必須是一個(gè)變量14.2.2有參數(shù)的存儲(chǔ)過程三種參數(shù)傳遞模式的比較如表所1414.2.3

in參數(shù)in參數(shù),是輸入類型的參數(shù),表示這個(gè)參數(shù)輸入給過程,供過程使用。本小節(jié)將講述in參數(shù)的使用。前面我們講解到使用存儲(chǔ)過程可以檢查數(shù)據(jù)的完整性。下面就通過示例加深理解。14.2.3in參數(shù)in參數(shù),是輸入類型的參數(shù),表示這個(gè)1514.2.3

in參數(shù)1.創(chuàng)建包含in參數(shù)的存儲(chǔ)過程【示例14-10】對(duì)于表customersnew的插入操作,我們希望對(duì)提供的信息,account_mgr_id做判斷,如果符合要求,則可以執(zhí)行插入操作,否則,禁止添加顧客信息。14.2.3in參數(shù)1.創(chuàng)建包含in參數(shù)的存儲(chǔ)過程1614.2.3

in參數(shù)2.在存儲(chǔ)過程中為in參數(shù)賦值如果在存儲(chǔ)過程內(nèi)部,嘗試修改in參數(shù),那么將引起Oracle編譯錯(cuò)誤。【示例14-11】對(duì)于已經(jīng)創(chuàng)建的存儲(chǔ)過程insert_cus,在存儲(chǔ)過程內(nèi)部,嘗試將輸入?yún)?shù)mgr_id賦值為145。14.2.3in參數(shù)2.在存儲(chǔ)過程中為in參數(shù)賦值1714.2.3

in參數(shù)3.重建帶輸入?yún)?shù)的存儲(chǔ)過程【示例14-12】前面我們創(chuàng)建了一個(gè)無(wú)參數(shù)存儲(chǔ)過程pro_credit,用于修改表customersnew中列credit_limit的數(shù)據(jù),為status是“gold”的credit_limit增加10000?,F(xiàn)在將該存儲(chǔ)過程修改為帶輸入?yún)?shù)的存儲(chǔ)過程,可以指定顧客編號(hào)對(duì)credit_limit進(jìn)行相應(yīng)處理。4.執(zhí)行存儲(chǔ)過程【示例14-13】執(zhí)行存儲(chǔ)過程pro_credit,將所有顧客的credit_limit增加10000?!臼纠?4-14】在上述例子中,將所有顧客的credit_limit增加10000,現(xiàn)在將顧客編號(hào)為101的顧客增加10000。14.2.3in參數(shù)3.重建帶輸入?yún)?shù)的存儲(chǔ)過程1814.2.4

out參數(shù)out參數(shù)是輸出類型的參數(shù),表示這個(gè)參數(shù)在存儲(chǔ)過程中被復(fù)制,可以傳給過程提以外的部分。與in參數(shù)相反,out參數(shù)是只出不進(jìn)的參數(shù)。14.2.4out參數(shù)out參數(shù)是輸出類型的參數(shù),表示這1914.2.4

out參數(shù)1.創(chuàng)建一個(gè)帶out參數(shù)的存儲(chǔ)過程,并執(zhí)行【示例14-15】對(duì)于前面示例中的存儲(chǔ)過程insert_cus,在調(diào)用插入數(shù)據(jù)之后,我們通過查詢表中數(shù)據(jù)才能驗(yàn)證是否執(zhí)行成功。如果使用out參數(shù),更方便?!臼纠?4-16】執(zhí)行存儲(chǔ)過程out_cus。14.2.4out參數(shù)1.創(chuàng)建一個(gè)帶out參數(shù)的存儲(chǔ)過程2014.2.4

out參數(shù)2.創(chuàng)建包含in參數(shù)、out參數(shù)的存儲(chǔ)過程【示例14-17】創(chuàng)建存儲(chǔ)過程total_order,計(jì)算orders數(shù)據(jù)表中所有的訂單總和,參數(shù)設(shè)置時(shí),我們?cè)O(shè)置一個(gè)in參數(shù),一個(gè)out參數(shù)。【示例14-18】執(zhí)行存儲(chǔ)過程total_order。14.2.4out參數(shù)2.創(chuàng)建包含in參數(shù)、out參數(shù)的2114.2.5

inout參數(shù)inout參數(shù)綜合了上述兩種參數(shù)類型,既向過程體傳值,在過程中,也被賦值而傳到過程體外。inout參數(shù)既可以作為輸入也可以作為輸出。【示例14-19】結(jié)合使用inout參數(shù)的,實(shí)現(xiàn)交換兩個(gè)變量的值?!臼纠?4-20】執(zhí)行存儲(chǔ)過程exch,實(shí)現(xiàn)交換兩個(gè)變量的值。14.2.5inout參數(shù)inout參數(shù)綜合了上述兩2214.3

SQL

Developer工具創(chuàng)建存儲(chǔ)過程使用SQLDeveloper創(chuàng)建存儲(chǔ)過程是比較簡(jiǎn)單的。該工具提供一個(gè)相對(duì)便利的操作環(huán)境,尤其對(duì)于存儲(chǔ)過程的調(diào)試和錯(cuò)誤的查找都比語(yǔ)句創(chuàng)建存儲(chǔ)過程要方便。本節(jié)介紹在SQLDeveloper中創(chuàng)建和調(diào)試存儲(chǔ)過程。14.3SQLDeveloper工具創(chuàng)建存儲(chǔ)過程使用S2314.3.1創(chuàng)建存儲(chǔ)過程SQLDeveloper提供了創(chuàng)建存儲(chǔ)過程的模版,該模版允許輸入存儲(chǔ)過程名和參數(shù),然后自動(dòng)創(chuàng)建腳本。該腳本是一個(gè)簡(jiǎn)單框架,細(xì)節(jié)則需要用戶自己開發(fā)?!臼纠?4-21】利用SQLDeveloper工具創(chuàng)建存儲(chǔ)過程exch1,實(shí)現(xiàn)交換兩個(gè)變量的值。14.3.1創(chuàng)建存儲(chǔ)過程SQLDeveloper提供了2414.3.2調(diào)試存儲(chǔ)過程存儲(chǔ)過程創(chuàng)建之后,調(diào)試存儲(chǔ)過程是很有必要的,它和其他語(yǔ)言的調(diào)試功能類似,可以設(shè)置斷點(diǎn),可以分步執(zhí)行。本小節(jié)將簡(jiǎn)要介紹如何在PL/SQLDeveloper中調(diào)試修改存儲(chǔ)過程?!臼纠?4-22】在SQLDeveloper中調(diào)試存儲(chǔ)過程。14.3.2調(diào)試存儲(chǔ)過程存儲(chǔ)過程創(chuàng)建之后,調(diào)試存儲(chǔ)過程是2514.4管理存儲(chǔ)過程存儲(chǔ)過程創(chuàng)建之后,可以對(duì)其進(jìn)行調(diào)用。但是在后期使用中,如果有不合適的地方,需要對(duì)存儲(chǔ)過程進(jìn)行修改和刪除。本小節(jié)主要講解圖和修改存儲(chǔ)過程、重新編譯存儲(chǔ)過程以及刪除存儲(chǔ)過程。14.4管理存儲(chǔ)過程存儲(chǔ)過程創(chuàng)建之后,可以對(duì)其進(jìn)行調(diào)用。2614.4.1修改存儲(chǔ)過程當(dāng)存儲(chǔ)過程中出現(xiàn)錯(cuò)誤時(shí),可以修改存儲(chǔ)過程。修改存儲(chǔ)過程可以人為地把原來(lái)的存儲(chǔ)過程刪除,然后建立新的存儲(chǔ)過程,也可以使用Oracle提供的語(yǔ)法直接完成修改。14.4.1修改存儲(chǔ)過程當(dāng)存儲(chǔ)過程中出現(xiàn)錯(cuò)誤時(shí),可以修改2714.4.1修改存儲(chǔ)過程修改存儲(chǔ)過程使用replace關(guān)鍵字,即覆蓋。我們一般在創(chuàng)建存儲(chǔ)過程時(shí),就將該關(guān)鍵字寫上?!臼纠?4-23】創(chuàng)建存儲(chǔ)過程,完成一個(gè)數(shù)的加倍?!臼纠?4-24】修改存儲(chǔ)過程double1,將存儲(chǔ)過程的參數(shù)設(shè)置為inout參數(shù)類型,并修改賦值方式。14.4.1修改存儲(chǔ)過程修改存儲(chǔ)過程使用replace關(guān)2814.4.2重新編譯存儲(chǔ)過程存儲(chǔ)過程在某些情況下是需要重新編譯的,重新編譯可以獲得存儲(chǔ)過程的最新狀態(tài)。重新編譯存儲(chǔ)過程的語(yǔ)法結(jié)構(gòu)如圖所示。【示例14-25】重新編譯存儲(chǔ)過程double1,完成一個(gè)數(shù)的加倍?!臼纠?4-26】執(zhí)行存儲(chǔ)過程double1。14.4.2重新編譯存儲(chǔ)過程存儲(chǔ)過程在某些情況下是需要重2914.4.3刪除存儲(chǔ)過程不再需要存儲(chǔ)過程時(shí),可以將其刪除。利用語(yǔ)句刪除存儲(chǔ)過程的語(yǔ)法結(jié)構(gòu)如圖所示?!臼纠?4-27】刪除存儲(chǔ)過程double1。14.4.3刪除存儲(chǔ)過程不再需要存儲(chǔ)過程時(shí),可以將其刪除3014.4.3刪除存儲(chǔ)過程除了使用語(yǔ)句方法外,還可以使用工具刪除存儲(chǔ)過程。這種方式是在PL/SQLDeveloper中選中要?jiǎng)h除的存儲(chǔ)過程,右擊該過程,在彈出的快捷菜單中選擇“刪除”選項(xiàng),此時(shí)會(huì)出現(xiàn)確認(rèn)刪除窗口,單擊“是”按鈕即可。14.4.3刪除存儲(chǔ)過程除了使用語(yǔ)句方法外,還可以使用工3114.5小結(jié)存儲(chǔ)過程的使用十分普遍,是Oracle的重點(diǎn)知識(shí)。本章不僅介紹了存儲(chǔ)過程的概念和作用,而且詳細(xì)講解了如何讓創(chuàng)建和操作各種類型的存儲(chǔ)過程。本章的重點(diǎn)是如何根據(jù)需求創(chuàng)建合適的操作過程,難點(diǎn)是對(duì)存儲(chǔ)過程參數(shù)的設(shè)置,以及如何執(zhí)行存儲(chǔ)過程。下一章將學(xué)習(xí)函數(shù)和程序包。14.5小結(jié)存儲(chǔ)過程的使用十分普遍,是Oracle的重點(diǎn)32第14章存儲(chǔ)過程前面章節(jié)中講解了PL/SQL有關(guān)的內(nèi)容。事實(shí)上,PL/SQL主要包括匿名塊、存儲(chǔ)過程和存儲(chǔ)函數(shù)三種形式的PL/SQL塊。存儲(chǔ)過程是一段存儲(chǔ)在數(shù)據(jù)庫(kù)中執(zhí)行某功能的程序。使用存儲(chǔ)過程可以方便用戶使用數(shù)據(jù)庫(kù)中的應(yīng)用程序。本章重點(diǎn)介紹如何創(chuàng)建存儲(chǔ)過程以及如何在PL/SQL塊中使用過程訪問數(shù)據(jù)庫(kù)中的數(shù)據(jù)。第14章存儲(chǔ)過程前面章節(jié)中講解了PL/SQL有關(guān)的內(nèi)容。3314.1存儲(chǔ)過程簡(jiǎn)介在PL/SQL塊中常把一些功能相對(duì)獨(dú)立、需要經(jīng)常執(zhí)行的代碼定義為一個(gè)子程序,在需要時(shí)可以根據(jù)子程序的名字進(jìn)行調(diào)用,從而簡(jiǎn)化操作。這樣不僅便于程序設(shè)計(jì),而且有利于程序的調(diào)試。與其他PL/SQL塊一樣,在子程序中也可以定義變量、類型、游標(biāo)等,同樣可以進(jìn)行異常處理操作。需要注意的是有時(shí)必須向子程序提供參數(shù)(向子程序傳遞參數(shù))。PL/SQL的子程序有兩種形式,即過程和函數(shù)。過程與函數(shù)的區(qū)別在于函數(shù)有返回值,可以向調(diào)用者返回執(zhí)行結(jié)果,而過程沒有返回值。14.1存儲(chǔ)過程簡(jiǎn)介在PL/SQL塊中常把一些功能相對(duì)3414.1.1認(rèn)識(shí)存儲(chǔ)過程在Oracle數(shù)據(jù)庫(kù)中,可以將一些固定的操作集中起來(lái)由Oracle數(shù)據(jù)庫(kù)服務(wù)器來(lái)完成,以實(shí)現(xiàn)某個(gè)任務(wù),這就是存儲(chǔ)過程。存儲(chǔ)過程是Oracle開發(fā)者在數(shù)據(jù)轉(zhuǎn)換或查詢報(bào)表時(shí)經(jīng)常使用的方式之一。一旦在數(shù)據(jù)庫(kù)管理系統(tǒng)中創(chuàng)建了存儲(chǔ)過程對(duì)象,用戶就可以使用應(yīng)用程序,通過簡(jiǎn)單命令執(zhí)行存儲(chǔ)過程。存儲(chǔ)過程在第一次執(zhí)行時(shí),進(jìn)行語(yǔ)法檢查和編譯,執(zhí)行后,它的執(zhí)行計(jì)劃就駐留在高速緩存中,用于后續(xù)調(diào)用。存儲(chǔ)過程可以接收和輸出參數(shù),返回執(zhí)行存儲(chǔ)過程的狀態(tài)值,還可以嵌套調(diào)用。詳細(xì)內(nèi)容在下面講解。14.1.1認(rèn)識(shí)存儲(chǔ)過程在Oracle數(shù)據(jù)庫(kù)中,可以將一3514.1.2存儲(chǔ)過程的作用存儲(chǔ)過程的編寫相對(duì)復(fù)雜,但是很多人都在使用它。這是因?yàn)樗兄幌盗械膬?yōu)點(diǎn)。簡(jiǎn)化復(fù)雜操作。增加數(shù)據(jù)獨(dú)立性。提高安全性。實(shí)現(xiàn)表字段完整性。14.1.2存儲(chǔ)過程的作用存儲(chǔ)過程的編寫相對(duì)復(fù)雜,但是很3614.2

創(chuàng)建存儲(chǔ)過程和執(zhí)行存儲(chǔ)過程更傾向于數(shù)據(jù)庫(kù)操作。存儲(chǔ)過程的創(chuàng)建有固定的模式。我們可以使用語(yǔ)句的方法創(chuàng)建,也可以使用PL/SQL工具創(chuàng)建,本節(jié)主要學(xué)習(xí)使用語(yǔ)句的方法創(chuàng)建執(zhí)行存儲(chǔ)過程。14.2創(chuàng)建存儲(chǔ)過程和執(zhí)行存儲(chǔ)過程更傾向于數(shù)據(jù)庫(kù)操作。3714.2.1創(chuàng)建存儲(chǔ)過程在PL/SQL語(yǔ)句中,可以使用createorreplaceprocedure命令創(chuàng)建用戶自定義存儲(chǔ)過程。存儲(chǔ)過程包括無(wú)參數(shù)的存儲(chǔ)過程以及各類有參數(shù)的存儲(chǔ)過程。創(chuàng)建無(wú)參數(shù)的存儲(chǔ)過程語(yǔ)法結(jié)構(gòu)如圖所示。14.2.1創(chuàng)建存儲(chǔ)過程在PL/SQL語(yǔ)句中,可以使用c3814.2.1創(chuàng)建存儲(chǔ)過程1.創(chuàng)建無(wú)參數(shù)存儲(chǔ)過程無(wú)參數(shù)的存儲(chǔ)過程就是在創(chuàng)建的存儲(chǔ)過程中不帶任何參數(shù),通過這種存儲(chǔ)過程用做數(shù)據(jù)轉(zhuǎn)換的幾率比較大?!臼纠?4-1】創(chuàng)建一個(gè)簡(jiǎn)單的存儲(chǔ)過程,輸出信息“人生追求情趣,年輕追求個(gè)性?!??!臼纠?4-2】在數(shù)據(jù)表customersnew中,存儲(chǔ)了顧客信息?!臼纠?4-3】創(chuàng)建一個(gè)無(wú)參數(shù)存儲(chǔ)過程,用于修改表customersnew中列credit_limit的數(shù)據(jù),為status是“gold”的credit_limit增加10000。14.2.1創(chuàng)建存儲(chǔ)過程1.創(chuàng)建無(wú)參數(shù)存儲(chǔ)過程3914.2.1創(chuàng)建存儲(chǔ)過程2.查看存儲(chǔ)過程信息存儲(chǔ)過程一旦創(chuàng)建,就存儲(chǔ)在數(shù)據(jù)庫(kù)服務(wù)器上,Oracle允許開發(fā)人員查看已經(jīng)存在的存儲(chǔ)過程腳本,這可以通過數(shù)據(jù)字典(視圖)user_objects和user_source進(jìn)行查看。當(dāng)從視圖中查詢過程時(shí),需要把名稱大寫。14.2.1創(chuàng)建存儲(chǔ)過程2.查看存儲(chǔ)過程信息4014.2.1創(chuàng)建存儲(chǔ)過程(1)通過user_objects查看存儲(chǔ)過程?!臼纠?4-4】前面創(chuàng)建了創(chuàng)建一個(gè)無(wú)參數(shù)存儲(chǔ)過程pro_print,現(xiàn)在通過數(shù)據(jù)字典user_objects查看存儲(chǔ)過程信息。【示例14-5】利用user_source查看存儲(chǔ)過程pro_print的詳細(xì)信息。14.2.1創(chuàng)建存儲(chǔ)過程(1)通過user_object4114.2.1創(chuàng)建存儲(chǔ)過程3.顯示存儲(chǔ)過程的錯(cuò)誤編寫存儲(chǔ)過程時(shí)由于各種原因都有可能出現(xiàn)錯(cuò)誤而導(dǎo)致過程編譯失敗,這種情況下,可以利用視圖user_errors查看具體的錯(cuò)誤提示。【示例14-6】創(chuàng)建一個(gè)簡(jiǎn)單的帶有錯(cuò)誤的存儲(chǔ)過程,輸出信息“人生追求情趣,年輕追求個(gè)性?!薄!臼纠?4-7】利用user_errors查看存儲(chǔ)過程的具體的錯(cuò)誤提示。14.2.1創(chuàng)建存儲(chǔ)過程3.顯示存儲(chǔ)過程的錯(cuò)誤4214.2.1創(chuàng)建存儲(chǔ)過程4.執(zhí)行存儲(chǔ)過程存儲(chǔ)過程一旦創(chuàng)建,便可以被其他用戶調(diào)用。執(zhí)行存儲(chǔ)過程非常簡(jiǎn)單。當(dāng)處于PL/SQL代碼塊中時(shí),可以直接利用存儲(chǔ)過程名稱來(lái)調(diào)用和執(zhí)行存儲(chǔ)過程如下所示?!臼纠?4-8】調(diào)用和執(zhí)行存儲(chǔ)過程pro_print?!臼纠?4-9】使用execute命令調(diào)用存儲(chǔ)過程pro_credit。14.2.1創(chuàng)建存儲(chǔ)過程4.執(zhí)行存儲(chǔ)過程4314.2.2有參數(shù)的存儲(chǔ)過程無(wú)參數(shù)的存儲(chǔ)過程不會(huì)接受參數(shù)的傳入和傳出,是針對(duì)表或者視圖的查詢或者刪除操作,適合進(jìn)行數(shù)據(jù)的轉(zhuǎn)換操作。但是存儲(chǔ)過程可以帶參數(shù),實(shí)現(xiàn)特定的功能。參數(shù)的使用將增加存儲(chǔ)過程的靈活性,給數(shù)據(jù)庫(kù)編程帶來(lái)極大的方便。14.2.2有參數(shù)的存儲(chǔ)過程無(wú)參數(shù)的存儲(chǔ)過程不會(huì)接受參數(shù)4414.2.2有參數(shù)的存儲(chǔ)過程存儲(chǔ)過程的參數(shù)有三種:in(輸入類型)參數(shù)、out(輸出類型)參數(shù)和inout(輸入輸出類型)參數(shù)。在過程中可以定義參數(shù),在調(diào)用該過程時(shí),可以向過程傳遞實(shí)際參數(shù)。如果沒有參數(shù),則過程名后面的圓括號(hào)及參數(shù)列表可以省略。參數(shù)的定義形式如圖所示。14.2.2有參數(shù)的存儲(chǔ)過程存儲(chǔ)過程的參數(shù)有三種:in(4514.2.2有參數(shù)的存儲(chǔ)過程三種參數(shù)傳遞模式的比較如表所示。參數(shù)默認(rèn)值的作用是在調(diào)用過程時(shí),如果沒有提供實(shí)際參數(shù),則將此默認(rèn)值作為實(shí)際參數(shù)傳遞給過程。數(shù)據(jù)類型用來(lái)指定參數(shù)的類型,在參數(shù)定義中不能指定對(duì)參數(shù)的約束條件,即不能指定參數(shù)的長(zhǎng)度和是否為空等屬性。

inoutinout是否默認(rèn)默認(rèn)必須明確指定必須明確指定參數(shù)傳遞方向從調(diào)用者到過程從過程到調(diào)用者兩個(gè)方向形式參數(shù)的作用一個(gè)常量沒有初始化的變量經(jīng)過初始化的變量實(shí)際參數(shù)的形式常量、表達(dá)式、變量必須是一個(gè)變量必須是一個(gè)變量14.2.2有參數(shù)的存儲(chǔ)過程三種參數(shù)傳遞模式的比較如表所4614.2.3

in參數(shù)in參數(shù),是輸入類型的參數(shù),表示這個(gè)參數(shù)輸入給過程,供過程使用。本小節(jié)將講述in參數(shù)的使用。前面我們講解到使用存儲(chǔ)過程可以檢查數(shù)據(jù)的完整性。下面就通過示例加深理解。14.2.3in參數(shù)in參數(shù),是輸入類型的參數(shù),表示這個(gè)4714.2.3

in參數(shù)1.創(chuàng)建包含in參數(shù)的存儲(chǔ)過程【示例14-10】對(duì)于表customersnew的插入操作,我們希望對(duì)提供的信息,account_mgr_id做判斷,如果符合要求,則可以執(zhí)行插入操作,否則,禁止添加顧客信息。14.2.3in參數(shù)1.創(chuàng)建包含in參數(shù)的存儲(chǔ)過程4814.2.3

in參數(shù)2.在存儲(chǔ)過程中為in參數(shù)賦值如果在存儲(chǔ)過程內(nèi)部,嘗試修改in參數(shù),那么將引起Oracle編譯錯(cuò)誤。【示例14-11】對(duì)于已經(jīng)創(chuàng)建的存儲(chǔ)過程insert_cus,在存儲(chǔ)過程內(nèi)部,嘗試將輸入?yún)?shù)mgr_id賦值為145。14.2.3in參數(shù)2.在存儲(chǔ)過程中為in參數(shù)賦值4914.2.3

in參數(shù)3.重建帶輸入?yún)?shù)的存儲(chǔ)過程【示例14-12】前面我們創(chuàng)建了一個(gè)無(wú)參數(shù)存儲(chǔ)過程pro_credit,用于修改表customersnew中列credit_limit的數(shù)據(jù),為status是“gold”的credit_limit增加10000?,F(xiàn)在將該存儲(chǔ)過程修改為帶輸入?yún)?shù)的存儲(chǔ)過程,可以指定顧客編號(hào)對(duì)credit_limit進(jìn)行相應(yīng)處理。4.執(zhí)行存儲(chǔ)過程【示例14-13】執(zhí)行存儲(chǔ)過程pro_credit,將所有顧客的credit_limit增加10000。【示例14-14】在上述例子中,將所有顧客的credit_limit增加10000,現(xiàn)在將顧客編號(hào)為101的顧客增加10000。14.2.3in參數(shù)3.重建帶輸入?yún)?shù)的存儲(chǔ)過程5014.2.4

out參數(shù)out參數(shù)是輸出類型的參數(shù),表示這個(gè)參數(shù)在存儲(chǔ)過程中被復(fù)制,可以傳給過程提以外的部分。與in參數(shù)相反,out參數(shù)是只出不進(jìn)的參數(shù)。14.2.4out參數(shù)out參數(shù)是輸出類型的參數(shù),表示這5114.2.4

out參數(shù)1.創(chuàng)建一個(gè)帶out參數(shù)的存儲(chǔ)過程,并執(zhí)行【示例14-15】對(duì)于前面示例中的存儲(chǔ)過程insert_cus,在調(diào)用插入數(shù)據(jù)之后,我們通過查詢表中數(shù)據(jù)才能驗(yàn)證是否執(zhí)行成功。如果使用out參數(shù),更方便?!臼纠?4-16】執(zhí)行存儲(chǔ)過程out_cus。14.2.4out參數(shù)1.創(chuàng)建一個(gè)帶out參數(shù)的存儲(chǔ)過程5214.2.4

out參數(shù)2.創(chuàng)建包含in參數(shù)、out參數(shù)的存儲(chǔ)過程【示例14-17】創(chuàng)建存儲(chǔ)過程total_order,計(jì)算orders數(shù)據(jù)表中所有的訂單總和,參數(shù)設(shè)置時(shí),我們?cè)O(shè)置一個(gè)in參數(shù),一個(gè)out參數(shù)?!臼纠?4-18】執(zhí)行存儲(chǔ)過程total_order。14.2.4out參數(shù)2.創(chuàng)建包含in參數(shù)、out參數(shù)的5314.2.5

inout參數(shù)inout參數(shù)綜合了上述兩種參數(shù)類型,既向過程體傳值,在過程中,也被賦值而傳到過程體外。inout參數(shù)既可以作為輸入也可以作為輸出?!臼纠?4-19】結(jié)合使用inout參數(shù)的,實(shí)現(xiàn)交換兩個(gè)變量的值?!臼纠?4-20】執(zhí)行存儲(chǔ)過程exch,實(shí)現(xiàn)交換兩個(gè)變量的值。14.2.5inout參數(shù)inout參數(shù)綜合了上述兩5414.3

SQL

Developer工具創(chuàng)建存儲(chǔ)過程使用SQLDeveloper創(chuàng)建存儲(chǔ)過程是比較簡(jiǎn)單的。該工具提供一個(gè)相對(duì)便利的操作環(huán)境,尤其對(duì)于存儲(chǔ)過程的調(diào)試和錯(cuò)誤的查找都比語(yǔ)句創(chuàng)建存儲(chǔ)過程要方便。本節(jié)介紹在SQLDeveloper中創(chuàng)建和調(diào)試存儲(chǔ)過程。14.3SQLDeveloper工具創(chuàng)建存儲(chǔ)過程使用S5514.3.1創(chuàng)建存儲(chǔ)過程SQLDeveloper提供了創(chuàng)建存儲(chǔ)過程的模版,該模版允許輸入存儲(chǔ)過程名和參數(shù),然后自動(dòng)創(chuàng)建腳本。該腳本是一個(gè)簡(jiǎn)單框架,細(xì)節(jié)則需要用戶自己開發(fā)?!臼纠?4-21】利用SQLDeveloper工具創(chuàng)建存儲(chǔ)過程exch1,實(shí)現(xiàn)交換兩個(gè)變量的值。14.3.1創(chuàng)建存儲(chǔ)過程SQLDeveloper提供了5614.3.2調(diào)試存儲(chǔ)過程存儲(chǔ)過程創(chuàng)建之后,調(diào)試存儲(chǔ)過程是很有必要的

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論