国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

窺探mysql存儲過程細節

2024-07-24 13:08:57
字體:
來源:轉載
供稿:網友
這篇文章主要為大家詳細介紹了mysql存儲過程細節,對mysql存儲過程感興趣的小伙伴們可以參考一下
 

存儲過程,可以這樣認為,將我們需要特殊處理的sql語句封裝成函數,當需要的時候我們只需調用這個函數就可以實現我們想要的操作,這個過程我們可以稱之為存儲過程。當然了,真正存儲過程的定義不是這樣的。但是我們可以這樣簡單的去理解存儲過程。

下面我們看一個簡單的使用存儲過程的例子。

首先我們新建一張表 proced:

create table proced(     id int(5) primary key auto_increment,     name varchar(50),     type varchar(50));

然后我們需要向這個表中插入10萬條數據,這個時候我們需要借助存儲過程來實現這一功能。

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萬條數據了。

借助上述小例子,我們來講一下如何創建一個存儲過程。

創建存儲過程

首先我們來看一下創建存儲過程的語法:

CREATE PROCEDURE procedure_name(IN/OUT/INOUT parameter TYPE)BEGIN     procedure_bodyEND

這個過程比較簡單。

在上面的小例子中我們看到在創建存儲過程之前使用了delimiter //;,創建完成之后又再次 使用了命令 delimiter ;。

delimiter 是界定符,我們知道,在mysql命令行客戶端,是通過分號(;)來界定一個命令是否完成的。在存儲過程中,我們會多次使用到分號,但是這并不代表命令的結束,所以說我們需要使用delimiter命令來改變這個界定符。

mysql> delimiter //;  改變界定符為 //mysql> delimiter ; 重新改變界定符為分號

 

所以說我們如果使用mysql命令行創建存儲過程的話,我們必須在創建存儲過程之前使用上述命令改變界定符。

接下來我們看到procedure_name()中的IN/OUT/INOUT,這是代表什么意思呢?

一個IN類型的參數會傳遞一個值到存儲哦過程中,也就是我們在編程語言中自定義函數的參數。如果參數前面沒有指定是IN/OUT/INOUT,那默認會是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');

這就是在參數前指定IN的含義。

下面我們看OUT,指定為OUT的參數將從存儲過程中傳遞一個值給調用者,也就是說,OUT可以認為這個參數就是我們自定義函數中的返回值。

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指定的參數被調用者初始化,其值在存儲過程中可以被修改,并且任何改變對于調用者來說都是可見的。

看下面的例子:

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; 查看變量的值是否改變

以上就是創建一個簡單的存儲過程的方式。

刪除存儲過程

刪除存儲過程的語法:

DROP PROCEDURE IF EXISTS procedure_name

下面是使用實例:

mysql>drop procedure if exists proced;

修改存儲過程

存儲過程的修改時不能改變存儲過程內的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 }

總結:無論是刪除存儲過程還是修改存儲過程,必須保證你要修改或者刪除存儲過程沒有被其他存儲過程使用,例如你有存儲過程A,和存儲過程B。A在B中被使用,如果我們想修改A或者刪除A,必須確保B中不再使用A,否則如果我們刪除A以后,再調用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

以上就是對存儲過程簡單的介紹,希望對大家學習mysql存儲過程有所幫助。



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 肥东县| 四川省| 延庆县| 奈曼旗| 香港 | 响水县| 莱阳市| 昌江| 江口县| 黑水县| 文昌市| 松溪县| 聊城市| 沙雅县| 阜城县| 马鞍山市| 射洪县| 雅安市| 砚山县| 化德县| 高要市| 远安县| 玉环县| 凤山市| 平顶山市| 慈利县| 东光县| 平远县| 温宿县| 四子王旗| 东港市| 中山市| 固镇县| 葫芦岛市| 万安县| 五原县| 太康县| 宁晋县| 神农架林区| 富顺县| 正镶白旗|