【正文】
_spec。 53 AUTHID的語(yǔ)法如下: CREATE [OR REPLACE] FUNCTION function_name [parameter_list] RETURN return_type [AUTHID {CURRENT_USER | DEFINER}] {IS | AS} function_body。調(diào)用者的權(quán)限程序是通過(guò)使用 AUTHID子句而創(chuàng)建,該語(yǔ)句只適用于獨(dú)立子程序、包說(shuō)明和對(duì)象類型說(shuō)明。 52 調(diào)用者的權(quán)限與定義者的權(quán)限 ? Oracle8i提供了不同的外部引用解決方案。 49 e m p Em p lo y e e R a is e d Sa la r y 結(jié)果將被保存在 Us e r A. T e m p _ ta b le 圖 23 13 U s e r A 擁有的數(shù)據(jù)庫(kù)對(duì)象 R a is e _ Sa la r y T e m p _ ta b le U s e r A U s e r B 50 e m p Em p lo y e e R a is e d Sa la r y 結(jié)果將保存在 Us e r A. te m p _ ta b le 圖 23 14 U s e r A 和 U s e r B 所擁有的 t e m p _ t a b l e R a is e _ Sa la r y te m p _ ta b le U s e r A U s e r B Us e r B . te m p _ ta b le 將不會(huì)被修改 te m p _ ta b le 51 存儲(chǔ)子程序和角色 ? 子程序使用顯式地(而不是通過(guò)角色)授權(quán)其所有者的特權(quán)而執(zhí)行。 GRANT語(yǔ)句把這些特權(quán)賦予數(shù)據(jù)庫(kù)用戶或角色。 ? 可串行復(fù)用包和非串行復(fù)用包: PL/SQL 及更高版本允許程序員對(duì)包做可串行復(fù)用標(biāo)志。 ? 包的運(yùn)行時(shí)狀態(tài),即打包的變量和游標(biāo),則存放在用戶全局區(qū)( UGA)的會(huì)話存儲(chǔ)區(qū)中。如果該包頭有變化,則會(huì)使包體自動(dòng)失效,這是因?yàn)樵摪w依賴于包頭 。 ? 包的依賴性:包體的變化不會(huì)導(dǎo)致修改包頭。該過(guò)程或函數(shù)就依賴于這些存儲(chǔ)的對(duì)象。如果修改了調(diào)用塊的話,則該塊調(diào)用的子程序作為所屬塊的一部分也要重新編譯 可以使用 編譯后 pcode代碼存儲(chǔ)在共享池中。如果其所在語(yǔ)句塊是匿名塊并需要多次運(yùn)行時(shí),則該子程序就必須每次進(jìn)行編譯 存儲(chǔ)子程序可以從對(duì)該子程序具有 EXECUTE特權(quán)的用戶所提交的任何語(yǔ)句塊中調(diào)用 局部子程序只能從包含子程序的語(yǔ)句塊中調(diào)用 由于存儲(chǔ)子程序與調(diào)用塊的相互隔離,調(diào)用塊具有代碼少,易于理解的特點(diǎn)。 ? 局部子程序也可以重載 43 存儲(chǔ)子程序和局部子程序的比較 存儲(chǔ)子程序 局部子程序 該類子程序以編譯后生成的偽代碼形式 pcode存儲(chǔ)在數(shù)據(jù)庫(kù)中。其他語(yǔ)句塊不能調(diào)用該函數(shù),因?yàn)樵摵瘮?shù)對(duì)其他語(yǔ)句塊來(lái)說(shuō)是不可見(jiàn)的。 41 局部子程序 ? 局部子程序 :是一個(gè)在 PL/SQL語(yǔ)句塊的聲明段中聲明的子程序。這允許同一個(gè)子程序可以接受不同類型的參數(shù)。在包體聲明的所有元素都是局部的,只能在包體中引用它們,而 不能在包外引用。包有兩個(gè)獨(dú)立的部分:說(shuō)明和包體,這兩部分獨(dú)立地存儲(chǔ)在數(shù)據(jù)字典中。 8. 將值傳遞到參數(shù)可以使用兩種方法:占位符和命名符。當(dāng)參數(shù)是按引用傳遞時(shí),一個(gè)指向?qū)崊⒌闹羔槍⒈粋鬟f到對(duì)應(yīng) 的形參。形參具有 3種模式: IN、 OUT和 IN OUT。 6. 形參指的是子程序聲明段中的參數(shù)。在聲明段包括了一個(gè) RETURN語(yǔ)句,指出返回值的數(shù)據(jù)類型,在可執(zhí)行段至少包括一個(gè) RETURN語(yǔ)句,但只會(huì)執(zhí)行其中一個(gè)。 4. 過(guò)程是一個(gè) PL/SQL語(yǔ)句,而函數(shù)是表達(dá)式的一部分。子程序是一種可以執(zhí)行操作和接收參數(shù)的命名塊。存儲(chǔ)子程序是保存在數(shù)據(jù)庫(kù)中的命名塊。 ? 在大多數(shù)情況下,在會(huì)話內(nèi)首次對(duì)一個(gè)包進(jìn)行實(shí)例化操作時(shí),要運(yùn)行初始化代碼。 ? 重載函數(shù)的參數(shù)的類型系列( type family)必須不同,也就是說(shuō),不能對(duì)同一個(gè)類型系列的過(guò)程進(jìn)行重載。 ? ?如果兩個(gè)子程序的參數(shù)僅在名稱和模式上不同,則這兩個(gè)過(guò)程不能重載。 37 重載封裝子程序 ? 在包的內(nèi)部,過(guò)程和函數(shù)可以被重載。 ? 在包體中可以包含私有聲明。 36 包和作用域 ? 包頭中聲明的任何對(duì)象都是在其作用域中,并且可在其外部使用包名作為前綴對(duì)其進(jìn)行引用。 ? 包頭中的任何預(yù)先聲明不能出現(xiàn)在包體中。 ? 包體是可選的。 ? 包體中包含包頭中預(yù)先聲明的子程序的代碼。 35 包體 ? 包體是一個(gè)獨(dú)立于包頭的數(shù)據(jù)字典對(duì)象。 34 包的說(shuō)明 ? 包的說(shuō)明:也叫做包頭,包含了有關(guān)包的內(nèi)容的信息。 ? 包只能被存儲(chǔ),而且不可能是局部的。 32 包 ? 包是由存儲(chǔ)在一起的相關(guān)對(duì)象組成的PL/SQL結(jié)構(gòu)。 31 過(guò)程、函數(shù)練習(xí) 創(chuàng)建一個(gè)過(guò)程,向 DEPT插入一個(gè)新單位,通過(guò)兩個(gè)變量提供單位編號(hào)和單位名稱 創(chuàng)建一個(gè)過(guò)程,修改 DEPT中的某一單位的單位名稱,過(guò)程應(yīng)包括異常處理。 ? 如果只有一個(gè)返回值,使用函數(shù)就可以滿足要求。 ? 過(guò)程和函數(shù)都可以接受參數(shù) NOCOPY(僅Oracle8i及更高版本支持)。 ? 過(guò)程和函數(shù)都可以接受缺省值。 parameter_name [mode] parameter_type{:=|DEFAULT} initial_value 29 過(guò)程與函數(shù)的比較 相同點(diǎn): ? 通過(guò)設(shè)置 OUT參數(shù),過(guò)程和函數(shù)都可以返回一個(gè)以上的值。如果一個(gè)參數(shù)有缺省值的話,該參數(shù)就可以不從調(diào)用環(huán)境中傳遞。但是,該類調(diào)用的第一個(gè)參數(shù)必須是通過(guò)位置指定,而其余的參數(shù)可以根據(jù)名稱指定。這就允許我們?cè)谛枰獣r(shí)重新安排參數(shù)的順序。 26 定位符和命名符 ? 實(shí)參都通過(guò)位置與對(duì)應(yīng)的形參相關(guān)聯(lián),參數(shù)間的這種對(duì)應(yīng)法稱為定位符( Positional Notation)。函數(shù)也具有類似的情況。 ? 按值傳遞 IN OUT模式的參數(shù)所使用的時(shí)間遠(yuǎn)遠(yuǎn)大于按引用傳遞 IN和 IN OUT NOCOPY參數(shù)所使用的時(shí)間。 24 使用 NOCOPY的優(yōu)點(diǎn) ? NOCOPY的主要優(yōu)點(diǎn)是可以提高程序的效率。在這種情況下,編譯器不會(huì)報(bào)告編譯錯(cuò)誤。換句話說(shuō),如果過(guò)程退出時(shí)沒(méi)有處理異常而形參已被修改的話,則該形參對(duì)應(yīng)的實(shí)參的原始值也將被修改。 21 使用 NOCOPY參數(shù) ? 語(yǔ)法如下: parameter_name [mode] NOCOPY datatype ?parameter_name是參數(shù)名 ?mode是參數(shù)的模式( IN, OU, IN OUT) ?datatype是參數(shù)的數(shù)據(jù)類型 ?如果使用了 NOCOPY,則 PL/SQL編譯器將按引用傳遞參數(shù),而不按值傳遞 ?由于 NOCOPY是一個(gè)編譯選項(xiàng),而非指令,所以該選項(xiàng)不總是被采用。 ? 按引用傳遞:一個(gè)指向?qū)崊⒌闹羔槍⒈粋鬟f到對(duì)應(yīng)的形參。這些實(shí)參仍將被設(shè)置為調(diào)用前的值。 ? 如果引發(fā)異常的過(guò)程中沒(méi)有處理該錯(cuò)誤的異常處理程序(或該異常發(fā)生在該異常處理程序的內(nèi)部),根據(jù)異常的傳播規(guī)則,控制將立即轉(zhuǎn)出該過(guò)程返回其調(diào)用環(huán)境。 19 子程序內(nèi)部引發(fā)的異常 ? 如果錯(cuò)誤發(fā)生在子程序的內(nèi)部,就會(huì)引發(fā)異常。 p_Parameter2:=。 舉例