窺探mysql存儲過程細(xì)節(jié)
存儲過程,可以這樣認(rèn)為,將我們需要特殊處理的sql語句封裝成函數(shù),當(dāng)需要的時候我們只需調(diào)用這個函數(shù)就可以實(shí)現(xiàn)我們想要的操作,這個過程我們可以稱之為存儲過程。當(dāng)然了,真正存儲過程的定義不是這樣的。但是我們可以這樣簡單的去理解存儲過程。
下面我們看一個簡單的使用存儲過程的例子。
首先我們新建一張表 proced:
create table proced(
id int(5) primary key auto_increment,
name varchar(50),
type varchar(50)
);
然后我們需要向這個表中插入10萬條數(shù)據(jù),這個時候我們需要借助存儲過程來實(shí)現(xiàn)這一功能。
mysql> delimiter //
mysql> create procedure adddata()
-->begin
-->declare n int default 0;
-->while n<100000
-->do
-->insert into proced(name,type) values(‘跡憶博客','onmpw');
-->set n = n+1;
-->end while;
-->end
-->//
mysql> delimiter ;
mysql> call adddata();
使用上述存儲過程,我們就可以向proced表中插入10萬條數(shù)據(jù)了。
借助上述小例子,我們來講一下如何創(chuàng)建一個存儲過程。
創(chuàng)建存儲過程
首先我們來看一下創(chuàng)建存儲過程的語法:
CREATE PROCEDURE procedure_name(IN/OUT/INOUT parameter TYPE)
BEGIN
procedure_body
END
這個過程比較簡單。
在上面的小例子中我們看到在創(chuàng)建存儲過程之前使用了delimiter //;,創(chuàng)建完成之后又再次 使用了命令 delimiter ;。
delimiter 是界定符,我們知道,在mysql命令行客戶端,是通過分號(;)來界定一個命令是否完成的。在存儲過程中,我們會多次使用到分號,但是這并不代表命令的結(jié)束,所以說我們需要使用delimiter命令來改變這個界定符。
mysql> delimiter //; 改變界定符為 // mysql> delimiter ; 重新改變界定符為分號
所以說我們?nèi)绻褂胢ysql命令行創(chuàng)建存儲過程的話,我們必須在創(chuàng)建存儲過程之前使用上述命令改變界定符。
接下來我們看到procedure_name()中的IN/OUT/INOUT,這是代表什么意思呢?
一個IN類型的參數(shù)會傳遞一個值到存儲哦過程中,也就是我們在編程語言中自定義函數(shù)的參數(shù)。如果參數(shù)前面沒有指定是IN/OUT/INOUT,那默認(rèn)會是IN,看下面的例子:
mysql>delimiter //
mysql> create procedure in_proced(IN param VARCHAR(100))
-->begin
-->insert into proced(name,type) values(param,'onmpw');
-->end
-->//
mysql>delimiter ;
mysql> call in_proced(‘onmpw.com');
這就是在參數(shù)前指定IN的含義。
下面我們看OUT,指定為OUT的參數(shù)將從存儲過程中傳遞一個值給調(diào)用者,也就是說,OUT可以認(rèn)為這個參數(shù)就是我們自定義函數(shù)中的返回值。
mysql> delimiter //
mysql> create procedure out_proced(OUT param INT)
-->begin
-->select count(*) into param from proced;
-->end
-->//
mysql>delimiter ;
mysql> call out_proced(@a);
mysql>select @a;
+------+
| @a |
+------+
| 3 |
+------+
最后就是INOUT,很明顯INOUT指定的參數(shù)被調(diào)用者初始化,其值在存儲過程中可以被修改,并且任何改變對于調(diào)用者來說都是可見的。
看下面的例子:
mysql> delimiter //
mysql> create procedure inout_proced(INOUT param INT)
--> begin
--> select count(*) into param from proced where id>param;
--> end
-->//
mysql>delimiter ;
mysql>set @a = 3;
mysql>call inout_proced(@a);
mysql>select @a; 查看變量的值是否改變
以上就是創(chuàng)建一個簡單的存儲過程的方式。
刪除存儲過程
刪除存儲過程的語法:
DROP PROCEDURE IF EXISTS procedure_name
下面是使用實(shí)例:
mysql>drop procedure if exists proced;
修改存儲過程
存儲過程的修改時不能改變存儲過程內(nèi)的sql語句的,只能改變其屬性,其語法如下:
ALTER PROCEDURE proc_name [characteristic ...]
characteristic:
COMMENT 'string'
| LANGUAGE SQL
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
總結(jié):無論是刪除存儲過程還是修改存儲過程,必須保證你要修改或者刪除存儲過程沒有被其他存儲過程使用,例如你有存儲過程A,和存儲過程B。A在B中被使用,如果我們想修改A或者刪除A,必須確保B中不再使用A,否則如果我們刪除A以后,再調(diào)用B的時候就會報錯。
舉個例子:
mysql>delimiter //
mysql>create procedure A(IN pa1 INT,OUT pa2 INT)
-->begin
-->select count(*) into pa2 from proced where id>pa1;
-->end
-->//
mysql>create procedure B(INOUT pa INT)
-->begin
-->declare v int;
-->call A(pa,v);
-->set pa = v;
-->end
-->//
mysql>delimiter ;
mysql>drop procedure A;
mysql>set @a=5;
mysql>call B(@a);
ERROR 1305 (42000): PROCEDURE test.A does not exists
以上就是對存儲過程簡單的介紹,希望對大家學(xué)習(xí)mysql存儲過程有所幫助。
相關(guān)文章
Mysql5.7在windows7下my.ini文件加載路徑及數(shù)據(jù)位置修改方法
這篇文章主要介紹了Mysql5.7在windows7下my.ini文件加載路徑及數(shù)據(jù)位置修改方法,需要的朋友可以參考下2018-02-02
Centos 5.2下安裝多個mysql數(shù)據(jù)庫配置詳解
在實(shí)際應(yīng)用中,有時候,我們需要在同一臺服務(wù)器上安裝兩個甚至多個mysql數(shù)據(jù)庫,那么,如何來操作呢,今天我們就來探討下這個問題2014-07-07
MySQL主庫binlog(master-log)與從庫relay-log關(guān)系代碼詳解
這篇文章主要介紹了MySQL主庫binlog與從庫relay-log關(guān)系的相關(guān)內(nèi)容,涉及部分代碼,需要的朋友可以參考。2017-10-10

