轉(zhuǎn)載:http://www.cnblogs.com/chenpi/p/5136483.html
閱讀目錄
創(chuàng)建一個(gè)簡(jiǎn)單的存儲(chǔ)過(guò)程
什么是存儲(chǔ)過(guò)程
簡(jiǎn)單的說(shuō)掌实,就是一組SQL語(yǔ)句集苟鸯,功能強(qiáng)大瘦穆,可以實(shí)現(xiàn)一些比較復(fù)雜的邏輯功能右莱,類似于JAVA語(yǔ)言中的方法;
ps:存儲(chǔ)過(guò)程跟觸發(fā)器有點(diǎn)類似氏堤,都是一組SQL集沙绝,但是存儲(chǔ)過(guò)程是主動(dòng)調(diào)用的搏明,且功能比觸發(fā)器更加強(qiáng)大鼠锈,觸發(fā)器是某件事觸發(fā)后自動(dòng)調(diào)用;
有哪些特性
有輸入輸出參數(shù)星著,可以聲明變量购笆,有if/else, case,while等控制語(yǔ)句,通過(guò)編寫存儲(chǔ)過(guò)程虚循,可以實(shí)現(xiàn)復(fù)雜的邏輯功能同欠;
函數(shù)的普遍特性:模塊化,封裝横缔,代碼復(fù)用铺遂;
速度快,只有首次執(zhí)行需經(jīng)過(guò)編譯和優(yōu)化步驟茎刚,后續(xù)被調(diào)用可以直接執(zhí)行襟锐,省去以上步驟;
創(chuàng)建一個(gè)簡(jiǎn)單的存儲(chǔ)過(guò)程
存儲(chǔ)過(guò)程proc_adder功能很簡(jiǎn)單膛锭,兩個(gè)整型輸入?yún)?shù)a和b粮坞,一個(gè)整型輸出參數(shù)sum,功能就是計(jì)算輸入?yún)?shù)a和b的結(jié)果初狰,賦值給輸出參數(shù)sum莫杈;
幾點(diǎn)說(shuō)明:
DELIMITER ;;:之前說(shuō)過(guò)了,把默認(rèn)的輸入的結(jié)束符;替換成;;奢入。
DEFINER:創(chuàng)建者筝闹;
--------------------------------Procedure structure for `proc_adder`------------------------------DROPPROCEDUREIFEXISTS`proc_adder`;DELIMITER ;;CREATE DEFINER=`root`@`localhost`PROCEDURE `proc_adder`(IN aint,IN bint, OUTsumint)BEGIN#Routine body goes here...DECLARE cint;if aisnullthenset a=0;endif;if bisnullthenset b=0;endif;
setsum= a+b;END;;
DELIMITER ;
執(zhí)行以上存儲(chǔ)結(jié)果,驗(yàn)證是否正確腥光,如下圖丁存,結(jié)果OK:
set@b=5;call proc_adder(2,@b,@s);select@sassum;
存儲(chǔ)過(guò)程中的控制語(yǔ)句
IF語(yǔ)句:
--------------------------------Procedure structure for `proc_if`------------------------------DROPPROCEDUREIFEXISTS`proc_if`;DELIMITER ;;CREATE DEFINER=`root`@`localhost`PROCEDURE `proc_if`(IN typeint)BEGIN#Routine body goes here...DECLARE cvarchar(500);IF type=0THENset c='param is 0';? ? ELSEIF type=1THENset c='param is 1';ELSEset c='param is others, not 0 or 1';ENDIF;selectc;END;;
DELIMITER ;
CASE語(yǔ)句:
--------------------------------Procedure structure for `proc_case`------------------------------DROPPROCEDUREIFEXISTS`proc_case`;DELIMITER ;;CREATE DEFINER=`root`@`localhost`PROCEDURE `proc_case`(IN typeint)BEGIN#Routine body goes here...DECLARE cvarchar(500);CASEtypeWHEN0THENset c='param is 0';WHEN1THENset c='param is 1';ELSEset c='param is others, not 0 or 1';ENDCASE;selectc;END;;
DELIMITER ;
循環(huán)while語(yǔ)句:
--------------------------------Procedure structure for `proc_while`------------------------------DROPPROCEDUREIFEXISTS`proc_while`;DELIMITER ;;CREATE DEFINER=`root`@`localhost`PROCEDURE `proc_while`(IN nint)BEGIN#Routine body goes here...DECLARE iint;DECLARE sint;SET i=0;SET s=0;WHILE i<=n DOset s= s+i;set i= i+1;ENDWHILE;SELECTs;END;;
DELIMITER ;
其它:略~
存儲(chǔ)過(guò)程弊端
不同數(shù)據(jù)庫(kù),語(yǔ)法差別很大柴我,移植困難解寝,換了數(shù)據(jù)庫(kù),需要重新編寫艘儒;
不好管理聋伦,把過(guò)多業(yè)務(wù)邏輯寫在存儲(chǔ)過(guò)程不好維護(hù)夫偶,不利于分層管理,容易混亂觉增,一般存儲(chǔ)過(guò)程適用于個(gè)別對(duì)性能要求較高的業(yè)務(wù)兵拢,其它的必要性不是很大;