一、存儲過程sql
# 建立存儲過程delimiter // create procedure 存儲過程名稱([in|out|inout]參數名,數據類型) begin 存儲過程體 end //delimiter ; call 存儲過程名稱(參數) # 調用存儲過程
# in 輸入參數,b 後面括號中接收參數delimiter //drop procedure if exists b; create procedure b(in n int) begin select n; set n = 2; select n; end//delimiter ; set @n = 1; call b(@n); # 調用存儲過程 b+------+ | n | +------+ | 1 | +------+ +------+ | n | +------+ | 2 | +------+
# out 輸出參數# out 是向調用者輸出參數,不接收輸入的參數delimiter //drop procedure if exists b; create procedure b(out n int) begin select n; set n = 2; select n; end//delimiter ; set @n = 1; call b(@n); # 調用存儲過程 b+-------+ | n | +-------+ | NULL | # 由於 out 是向調用者輸出參數,不接收輸入的參數,因此存儲過程裏的 n 爲 null+-------+ +-------+ | n | +-------+ | 2 | +-------+
# inout 輸入參數delimiter //drop procedure if exists b; create procedure b(inout n int) begin select n; set n = 2; select n; end//delimiter ; set @n = 1; call b(@n); # 調用存儲過程 b+---------+ | n | +---------+ | 1 | +---------+ +---------+ | n | +---------+ | 2 | +---------+
二、實例數據庫
-- 建立表 t_grade 且往表 t_grade 中循環插入數據 delimiter // -- 定義結束符drop procedure if exists insertData; create procedure insertData(n int) -- 注意參數必須攜帶數據類型 begin declare x int default 1; -- 變量在一開始就須要定義 drop table if exists t_grade; create table t_grade(id int(10), grade int(3));while n < 100000 do insert into t_grade values(x, (select floor(rand()*6 + 80))); -- 隨機生成分數 set x = x + 1; set n = n + 1; end while;select count(*) from t_grade; end//delimiter ; call insertData(100); -- 調用存儲過程
delimiter //drop PROCEDURE if EXISTS i;CREATE PROCEDURE i(n int)BEGINDECLARE x int DEFAULT 1;DECLARE y varchar(20) DEFAULT "";DECLARE z int DEFAULT 22;while n <=100 DO set y = CONCAT("zhangsan",x); INSERT into t VALUES(x,y,z); set x = x + 1; set n = n + 1;end WHILE;SELECT COUNT(*) from t;end//delimiter ; call i(1);
-- create table t_user(id int(6),user_name varchar(20),user_pwd varchar(20),verify varchar(5)); delimiter //drop procedure if exists insert_user_data; create procedure insert_user_data(n int) begin declare x int default(select count(*) from t_user); if x >= n then select count(*) from t_user; else while x < n do insert into t_user values(x+1, CONCAT("user",x+1), "123456", (select substring(rand(),3,6))); set x = x + 1; end while; end if; end//delimiter ; call insert_user_data(500);
delimiter //drop procedure if exists b;create procedure b(in n int)begin declare x int default 1;while n < 10 do delete from t where id = x; set n = n + 1; set x = x + 1;end while;select * from t;end//delimiter ; call b(0) # 調用存儲過程
delimiter //drop procedure if exists c;create procedure c(n int)BEGINdrop table if exists dcs;create table dcs(id int(1),name varchar(10),sex char(2));alter table dcs change id id int(1) primary key auto_increment;insert into dcs(name,sex)values('zhangsan1','m'),('lisi1','m');insert into dcs(name,sex)values('zhangsan2','m'),('lisi2','m');insert into dcs(name,sex)values('zhangsan3','m'),('lisi3','m');insert into dcs(name,sex)values('zhangsan4','m'),('lisi4','m');insert into dcs(name,sex)values('zhangsan5','m'),('lisi5','m'); if (n<>0) then select * from dcs where id < n;else select * from dcs;end if;end//delimiter ; call c(6) # 調用存儲過程