1诸典、創(chuàng)建語法不同
oracle:
CREATE OR REPLACE PROCEDURE 語法創(chuàng)建存儲過程;
mysql:
CREATE PROCEDURE創(chuàng)建崎苗,如果已經(jīng)存在狐粱,只能先DROP舀寓,再CREATE
2、MySQL存儲過程名字后面的”()”是必須的肌蜻,即使沒有一個參數(shù)互墓;MySQL 存儲過程的參數(shù)不能指定默認(rèn)值,不能在參數(shù)名稱前加“@”宋欺;
3轰豆、IN/OUT/INOUT關(guān)鍵字的位置不同
oracle:
參數(shù)類型IN/OUT/INOUT寫在參數(shù)名后面且都不能省略胰伍;
mysql:
參數(shù)類型IN/OUT/INOUT寫在參數(shù)名前面齿诞,如果是IN,則可以省略,如果是OUT或INOUT則不能省略骂租;
4祷杈、變量的聲明的位置不同
oracle:
變量的聲明在BEGIN…END體之前;
mysql:
變量的聲明在BEGIN…END體內(nèi)渗饮,BEGIN關(guān)鍵字之后 其他內(nèi)容之前;
變量名不能和列名相同但汞, MySQL不區(qū)分大小寫;
5互站、退出的關(guān)鍵字不一樣
oracle:
存儲過程和方法都可以使用return退出當(dāng)前過程私蕾;
mysql:
存儲過程中只能使用leave退出當(dāng)前存儲過程,不可以使用return胡桃,如:leave label踩叭;
6、調(diào)用方式不同
oracle:
存儲過程中調(diào)用存儲過程:直接寫存儲過程名即可翠胰,如:prc_Procedure_Name(參數(shù))容贝,沒有參數(shù)時(shí)可省略“()”;
java代碼中調(diào)用存儲過程:使用call 關(guān)鍵字之景,如CALL prc_Procedure_Name(參數(shù))斤富,即使沒有一個參數(shù)也需要“()”;
mysql:
存儲過程中調(diào)用存儲過程:使用call 關(guān)鍵字,如CALL prc_Procedure_Name(參數(shù))锻狗,即使沒有一個參數(shù)也需要“()”;
java代碼中調(diào)用存儲過程:使用call 關(guān)鍵字满力,如CALL prc_Procedure_Name(參數(shù)),即使沒有一個參數(shù)也需要“()”;
7轻纪、異常處理不同
oracle:
1油额、支持自定義異常,使用raise關(guān)鍵字拋出異常桐磁,如:RAISE Exception_Name;
2悔耘、存儲過程或函數(shù)末尾寫上EXCEPTION后,后面的部分即為異常處理的部分; 如下例:
EXCEPTION
WHEN OTHERS THEN
ROLLBACK ;
ov_rtn_msg := c_sp_name||'('|| li_debug_pos ||'):'||
TO_CHAR(SQLCODE)||': '||SUBSTR(SQLERRM,1,100);
mysql:
1我擂、不支持自定義異常衬以;
2贪壳、內(nèi)部異常也需要先定義,在定義的同時(shí)也需要實(shí)現(xiàn)異常的功能;如下例:
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK ;
set ov_rtn_msg = concat(c_sp_name,'(', li_debug_pos ,'):',
TO_CHAR(SQLCODE),': ',SUBSTR(SQLERRM,1,100));
END;
8败晴、包的聲明方式
oracle:
支持創(chuàng)建包未桥,包下面可以創(chuàng)建多個存儲過程和方法;
mysql:
沒有包的概念互妓,每個存儲過程和方法都是單獨(dú)的文件溪窒;
擴(kuò)展:
1、Oracle中冯勉,存儲過程可以包括PL/SQL代碼澈蚌,它可以大大減少數(shù)據(jù)庫交互的次數(shù),從而提高數(shù)據(jù)庫性能灼狰。
2宛瞄、MySQL存儲過程支持的語言有SQL和C,而Oracle除了支持這兩種語言外交胚,還支持在存儲過程中使用Java和C++份汗;
3、Oracle存儲過程可以直接使用事務(wù)和鎖蝴簇,因此可以更好地維護(hù)數(shù)據(jù)的完整性杯活。
存儲過程的缺點(diǎn)(MySQL):
1、存儲過程的執(zhí)行效率相對較低熬词,復(fù)雜的邏輯處理會給數(shù)據(jù)帶來負(fù)擔(dān)和性能瓶頸(CPU)旁钧;
2、無法像對待普通SQL語句那樣生成最優(yōu)的執(zhí)行計(jì)劃荡澎,導(dǎo)致存儲過程的執(zhí)行效率較低均践。
3、存儲過程 內(nèi)存 占用高摩幔,會給數(shù)據(jù)庫帶來性能上的影響彤委;
4、可維護(hù)性低或衡,需要在數(shù)據(jù)庫端進(jìn)行維護(hù)和升級焦影,新的存儲過程需要重新編譯,這將占用數(shù)據(jù)庫的大量資源封断,影響其它用戶的操作斯辰;
5、影響范圍大坡疼,存儲過程的代碼出現(xiàn)嚴(yán)重的錯誤彬呻,可能會導(dǎo)致數(shù)據(jù)庫服務(wù)的崩潰;
6、可擴(kuò)展闸氮、平臺移植性低剪况,各個數(shù)據(jù)庫平臺(如oracle、mysql)之間的語法差異較大蒲跨,不便于跨平臺遷移译断;
7、mysql不提供存儲過程的驗(yàn)證或悲、調(diào)試功能孙咪;