Mysql存儲過程------存儲過程的基本概念和基本使用方法

一、 數據庫存儲過程的基本概念:

1、 存儲過程的概念:


百度百科對存儲過程的概述是這樣的: 存儲過程(Stored Procedure)是在大型數據庫系統中,一組爲了完成特定功能的SQL 語句集,存儲在數據庫中,
     經過第一次編譯後再次調用不需要再次編譯,用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。
存儲過程是數據庫中的一個重要對 象。


2、存儲過程的種類:


①、系統存儲過程:

以sp_開頭,用來進行系統的各項設定.取得信息.相關管理工作。

②、 本地存儲過程:

用戶創建的存儲過程是由用戶創建並完成某一特定功能的存儲過程,事實上一般所說的存儲過程就是指本地存儲過程。


③、 臨時存儲過程:

其中所謂臨時存儲過程分爲兩種:
其一:一是本地臨時存儲過程,以井字號(#)作爲其名稱的第一個字符,則該存儲過程將成爲一個存放在tempdb數據庫中的本地臨時存儲過程,且
   只有創建它的用戶才能執行它;

其二: 全局臨時存儲過程,以兩個井字號(##)號開始,則該存儲過程將成爲一個存儲在tempdb數據庫中的全局臨時存儲過程,全局臨時存儲過程
   一旦創建,以後連接到服務器的任意用戶都可以執行它,而且不需要特定的權限。

④、 遠程存儲過程:

在SQL Server2005中,遠程存儲過程(Remote Stored Procedures)是位於遠程服務器上的存儲過程,通常可以使用分佈式查詢和EXECUTE命令執行
   一個遠程存儲過程。

⑤、 擴展存儲過程:

擴展存儲過程(Extended Stored Procedures)是用戶可以使用外部程序語言編寫的存儲過程,而且擴展存儲過程的名稱通常以xp_開頭。


二、存儲過程的基本使用方法:

1、 存儲過程的創建:

存儲過程的創建過程如下:

CREATE PROCEDURE proc_name ([proc_parameter[,...]])    
[characteristic]   
routine_body  
說明如下:

 proc_name代表存儲過程名稱;

        proc_parameter代表存儲過程參數列表。該列表中的每個參數由3部分組成,即輸入輸出類型、參數名稱和參數類型。其形式如下

: [ IN | OUT | INOUT ] param_name type ,其中[ IN | OUT | INOUT ]表示輸出類型(IN表示輸入參數;OUT表示輸出參數; I

NOUT表示既可以是輸入,也可以是輸出。輸入輸出類型也可以去掉,默認爲in); param_name表示參數名稱(注意:MySQL數

據庫存儲過程的參數名前不允許“@”,SQL Server數據庫中可以);type表示參數類型,該類型可以是MySQL數據庫的任意數據

類型。


        注意:MySQL數據庫存儲過程不需要在參數列表括號後面“as”關鍵字,但SQL Server數據庫中的存儲過程必須加“as”關鍵字

        characteristic指定存儲過程的特性;該參數有多個值:
                LANGUAGE SQL:說明routine_body部分是由SQL語言的語句組成,數據庫系統默認值。
                [NOT] DETERMINISTIC:指明存儲過程的執行結果是否是確定的。DETERMINISTIC表示結果是確定的,這時當每次執行存

儲過程時相同的輸入會得到相同的輸出。NOT DETERMINISTIC表示結果是非確定的,這時相同的輸入可能得到不同的輸出。默認

爲非確定。
                { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }:指明子程序使用SQL語句的限制。CONTAINS

SQL表示子程序包含SQL語句,但不包含讀或寫數據的語句;NO SQL表示子程序中不包含SQL語句;READS SQL DATA表示子程

序中包含讀數據的語句;MODIFIES SQL DATA表示子程序中包含寫數據的語句。默認爲CONTAINS SQL。
                SQL SECURITY { DEFINER | INVOKER }:指明誰有權限來執行。DEFINER表示只有定義者自己才能夠執行;INVOKER表示

調用者可以執行。默認爲DEFINER。
                COMMENT 'string':存儲過程註釋信息。

        routine_body參數爲存儲過程體,BEGIN…END標誌存儲過程體的開始和結束。存儲過程體可以是SELECT、UPDATE、INSERT、

DELETE、CREATE TABLE等SQL語句,也可以嵌入調用其它存儲過程的代碼,還可以是其它代碼(參見博客:《數據庫中的控制語句》)。

        注意:不能在 MySQL 存儲過程中使用 “return” 關鍵字。

   

2、 存儲過程的具體實例:

①、 使用存儲過程創建表結構:

DELIMITER &&
CREATE PROCEDURE CREATE_TABLE()
LANGUAGE SQL
BEGIN
	
	CREATE TABLE test_procedure(
		id INT(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵id',
		real_name VARCHAR(20) NOT NULL COMMENT '真實姓名',
		age INT(3) NOT NULL COMMENT '年齡',
		PRIMARY KEY(id)
		
	)ENGINE=INNODB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
END &&
DELIMITER ;

說明:上面創建了一個名稱爲create_table的存儲過程;
        注意:MySQL中默認的語句結束符爲分號(;),存儲過程中的SQL語句需要分號來結束,爲了避免衝突,首先用"DELIMITER &&"將MySQL的結束符設置爲&&,最後再

用"DELIMITER ;"來將結束符恢復成分號。這與創建觸發器是一樣的。
       

調用存儲過程:

--調用存儲過程CREATE_TABLE()生成表結構
CALL CREATE_TABLE();

②、 向創建好的表中添加數據:

--編寫存儲過程向創建好的表中添加數據
DELIMITER &&
CREATE PROCEDURE INSERT_DATA(IN U_REAL_NAME VARCHAR(20), IN U_AGE INT(3), OUT u_id INT(11))
LANGUAGE SQL
BEGIN 
	INSERT INTO test_procedure(real_name,age) VALUES(u_real_name, u_age);
	SET u_id=LAST_INSERT_ID();#set u_id=@@identity
END &&
DELIMITER ;
說明:上面創建的存儲過程參數列表中u_real_name和u_age爲輸入變量,u_id爲輸出變量,該輸出變量返回所添加數據對應的
主鍵值;

調用存儲過程插入數據並查詢結果:

#調用執行插入數據的存儲過程
CALL insert_data('曹操',51, @u_id);

#查詢數據插入情況
SELECT *FROM test_procedure;

③、 修改表中的數據:

#修改表中的數據
DELIMITER &&
CREATE PROCEDURE updata_data(IN u_id INT(11), IN u_real_name VARCHAR(20), IN u_age INT(3))
LANGUAGE SQL
BEGIN
	UPDATE test_procedure SET real_name = u_real_name, age=u_age WHERE id = u_id; 

END &&
DELIMITER ;

#調用存儲過程修改數據
CALL updata_data(5,'張學友', 56);

#查看修改情況
SELECT * FROM test_procedure;


④、 根據姓名進行模糊查詢獲得用戶信息:

#根據姓名模糊查詢出所有滿足條件的用戶信息
DELIMITER &&
CREATE PROCEDURE SELECT_ALL_DATA(IN u_real_name VARCHAR(20),OUT COUNT_NUM INT(11))
READS SQL DATA
BEGIN 
	SELECT COUNT(*) INTO COUNT_NUM FROM test_procedure WHERE real_name LIKE u_real_name;
END &&
DELIMITER ;

#調用模糊查詢存儲過程
CALL SELECT_ALL_DATA('周%', @count_num);
SELECT @count_num AS total;

⑤、 依據用戶名模糊查詢刪除數據:

#依據用戶名模糊查詢刪除數據
DELIMITER &&
CREATE PROCEDURE delete_datas(IN u_real_name VARCHAR(20), OUT effect_num INT(11))
LANGUAGE SQL

BEGIN 
	DELETE FROM test_procedure WHERE real_name LIKE u_real_name;
	SET effect_num = ROW_COUNT();#該函數用於返回受影響的行

END &&
DELIMITER ;

#調用存儲過程刪除數據
CALL delete_datas('周%', @effect_num);
SELECT @effect_num;


#查詢數據刪除情況
SELECT * FROM test_procedure;



3、查看存儲過程:

存儲過程的查看可以通過如下語句實現:SHOW PROCEDURE STATUS  WHERE db='數據庫名';或SHOW CREATE PROCEDURE 數據庫名.存儲過程名;或者使 用如下的語句可以查看所有數據庫的存儲過程。

SHOW PROCEDURE STATUS;

4、刪除存儲過程:

刪除存儲過程可以使用如下語句: DROP PROCEDURE 存儲過程名;

#刪除存儲過程
DROP PROCEDURE updata_data;


三、存儲過程的優點:


1、存儲過程增強了SQL語言靈活性。存儲過程可以使用控制語句編寫,可以完成複雜的判斷和較複雜的運算,有很強的靈活性;

        2、減少網絡流量,降低了網絡負載。存儲過程在數據庫服務器端創建成功後,只需要調用該存儲過程即可,而傳統的做法是每次都將大量

的SQL語句通過網絡發送至數據庫服務器端然後再執行;

        3、存儲過程只在創造時進行編譯,以後每次執行存儲過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用存儲過程可提高數據庫執行速度。
        4、系統管理員通過設定某一存儲過程的權限實現對相應的數據的訪問權限的限制,避免了非授權用戶對數據的訪問,保證了數據的安全。


  
以上
博客內容部分參照博文: http://blog.csdn.net/gaohuanjie/article/details/50996175(感謝博主的分享)























發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章