窺探mysql存儲(chǔ)過程細(xì)節(jié)
存儲(chǔ)過程,可以這樣認(rèn)為,將我們需要特殊處理的sql語句封裝成函數(shù),當(dāng)需要的時(shí)候我們只需調(diào)用這個(gè)函數(shù)就可以實(shí)現(xiàn)我們想要的操作,這個(gè)過程我們可以稱之為存儲(chǔ)過程。當(dāng)然了,真正存儲(chǔ)過程的定義不是這樣的。但是我們可以這樣簡(jiǎn)單的去理解存儲(chǔ)過程。
下面我們看一個(gè)簡(jiǎn)單的使用存儲(chǔ)過程的例子。
首先我們新建一張表 proced:
create table proced( id int(5) primary key auto_increment, name varchar(50), type varchar(50) );
然后我們需要向這個(gè)表中插入10萬條數(shù)據(jù),這個(gè)時(shí)候我們需要借助存儲(chǔ)過程來實(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();
使用上述存儲(chǔ)過程,我們就可以向proced表中插入10萬條數(shù)據(jù)了。
借助上述小例子,我們來講一下如何創(chuàng)建一個(gè)存儲(chǔ)過程。
創(chuàng)建存儲(chǔ)過程
首先我們來看一下創(chuàng)建存儲(chǔ)過程的語法:
CREATE PROCEDURE procedure_name(IN/OUT/INOUT parameter TYPE) BEGIN procedure_body END
這個(gè)過程比較簡(jiǎn)單。
在上面的小例子中我們看到在創(chuàng)建存儲(chǔ)過程之前使用了delimiter //;,創(chuàng)建完成之后又再次 使用了命令 delimiter ;。
delimiter 是界定符,我們知道,在mysql命令行客戶端,是通過分號(hào)(;)來界定一個(gè)命令是否完成的。在存儲(chǔ)過程中,我們會(huì)多次使用到分號(hào),但是這并不代表命令的結(jié)束,所以說我們需要使用delimiter命令來改變這個(gè)界定符。
mysql> delimiter //; 改變界定符為 // mysql> delimiter ; 重新改變界定符為分號(hào)
所以說我們?nèi)绻褂胢ysql命令行創(chuàng)建存儲(chǔ)過程的話,我們必須在創(chuàng)建存儲(chǔ)過程之前使用上述命令改變界定符。
接下來我們看到procedure_name()中的IN/OUT/INOUT,這是代表什么意思呢?
一個(gè)IN類型的參數(shù)會(huì)傳遞一個(gè)值到存儲(chǔ)哦過程中,也就是我們?cè)诰幊陶Z言中自定義函數(shù)的參數(shù)。如果參數(shù)前面沒有指定是IN/OUT/INOUT,那默認(rèn)會(huì)是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ù)將從存儲(chǔ)過程中傳遞一個(gè)值給調(diào)用者,也就是說,OUT可以認(rèn)為這個(gè)參數(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)用者初始化,其值在存儲(chǔ)過程中可以被修改,并且任何改變對(duì)于調(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)建一個(gè)簡(jiǎn)單的存儲(chǔ)過程的方式。
刪除存儲(chǔ)過程
刪除存儲(chǔ)過程的語法:
DROP PROCEDURE IF EXISTS procedure_name
下面是使用實(shí)例:
mysql>drop procedure if exists proced;
修改存儲(chǔ)過程
存儲(chǔ)過程的修改時(shí)不能改變存儲(chǔ)過程內(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é):無論是刪除存儲(chǔ)過程還是修改存儲(chǔ)過程,必須保證你要修改或者刪除存儲(chǔ)過程沒有被其他存儲(chǔ)過程使用,例如你有存儲(chǔ)過程A,和存儲(chǔ)過程B。A在B中被使用,如果我們想修改A或者刪除A,必須確保B中不再使用A,否則如果我們刪除A以后,再調(diào)用B的時(shí)候就會(huì)報(bào)錯(cuò)。
舉個(gè)例子:
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
以上就是對(duì)存儲(chǔ)過程簡(jiǎn)單的介紹,希望對(duì)大家學(xué)習(xí)mysql存儲(chǔ)過程有所幫助。
- mysql存儲(chǔ)過程中的異常處理解析
- MySQL存儲(chǔ)過程和函數(shù)的操作(十二)
- MySQL存儲(chǔ)過程的優(yōu)化實(shí)例
- 實(shí)例解析MySQL中的存儲(chǔ)過程及存儲(chǔ)過程的調(diào)用方法
- MySQL存儲(chǔ)過程中使用動(dòng)態(tài)行轉(zhuǎn)列
- MySql存儲(chǔ)過程之邏輯判斷和條件控制
- MySql存儲(chǔ)過程與函數(shù)詳解
- MySQL存儲(chǔ)過程中實(shí)現(xiàn)執(zhí)行動(dòng)態(tài)SQL語句的方法
- Java調(diào)用MySQL存儲(chǔ)過程并獲得返回值的方法
- mysql 存儲(chǔ)過程詳解
相關(guān)文章
MySQL插入不了中文數(shù)據(jù)問題的原因及解決
最近發(fā)現(xiàn)新安裝的MySQL數(shù)據(jù)庫(kù)不能插入中文字段,所以下面這篇文章主要給大家介紹了關(guān)于MySQL插入不了中文數(shù)據(jù)問題的原因及解決方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05淺談MySQL存儲(chǔ)過程中declare和set定義變量的區(qū)別
下面小編就為大家?guī)硪黄獪\談MySQL存儲(chǔ)過程中declare和set定義變量的區(qū)別。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12實(shí)現(xiàn)MySQL回滾的Python腳本的編寫教程
這篇文章主要介紹了實(shí)現(xiàn)MySQL回滾的Python腳本的編寫教程,文中的回滾針對(duì)的是DELETE語句的數(shù)據(jù)庫(kù)誤操作,需要的朋友可以參考下2015-11-11mysql數(shù)據(jù)庫(kù)忘記管理員密碼的解決方法
我們?cè)赪indows操作系統(tǒng)下編程會(huì)使用到MySQL數(shù)據(jù)庫(kù)。但是有時(shí),我們會(huì)忘記數(shù)據(jù)庫(kù)的登錄密碼?當(dāng)我們忘記了登錄密碼,無法進(jìn)入mysql時(shí),該怎么辦呢?這里我們提供mysql的登錄秘密的修改2018-02-02