资讯

展开

mysql-存储过程基础语法,整理下笔记

作者:快盘下载 人气:
delimiter $$  --声明结束符号 最终结束了就写这个

1.创建存储;
select 里面执行
CREATE PROCEDURE hello_prodcedure ()
BEGIN
	SELECT * from is_sys_user;
END $$

2.调用存储
call hello_prodcedure ()

3变量 分为局部变量 和 用户变量;理解为只存在当前连接的全局变量;
局部变量;仅在 begin/end中有效
用户变量;仅在当前会话连接有效;全局声明一次都能用;断开连接就失效了;


;局部变量;并赋值
delimiter $$
create PROCEDURE sp_test()
BEGIN
	DECLARE name VARCHAR(32) DEFAULT ;哈哈;;
	set name = ;ok;
	select name;
END $$


用户变量;
set ;aa = ;xx;;
select ;aa;

例子1 
delimiter $$
create PROCEDURE sp_test1()
BEGIN
	set ;name1 = ;ok;;
END $$

call sp_test1()

select ;name1;




例子2 给用户变量 into赋值
delimiter $$
create PROCEDURE sp_test2()
BEGIN
	select  nick_name into ;nickname from is_sys_user where user_id = ;1;;
END $$
call sp_test2()
select ;nickname;

例子3;根据id 查name
delimiter $$
create PROCEDURE sp_test3(in id int, out usernames VARCHAR(32))
-- 存储过程名;入参 入参名 入参类型;出参 出参名 出参类型;
BEGIN
	select  nick_name into usernames from is_sys_user where user_id = id;
-- 根据传来的id 查询name 并赋值给出参
END $$

call sp_test3(1,;usernames); 
-- 入参id为1 ;出参为用户变量

select ;usernames;

--查询用户变量

4.if 条件判断
例子1; 输入年龄 38以下是新员工  38-40是老员工  40以上是元老
delimiter //
CREATE PROCEDURE iftest(IN age INT)
BEGIN
	DECLARE type VARCHAR(32) DEFAULT(;空;);
	if age <=38
		then set type = ;新手;;
	ELSEIF age > 38 AND age < 40
		then set type = ;老员工;;
	ELSE
		 set type = ;元老;;
	end if;
	select type;
END //

call iftest(40);


5.loop 循环
delimiter //
CREATE PROCEDURE loops(in num INT)  -- 命名循环函数
BEGIN
	DECLARE nums int; -- 定义nums 局部变量
	set nums = num; -- 传来的值赋值给nums 局部变量
	numloop:loop  -- 定义循环 loop 起别名numloop
		if nums > 5 
		then LEAVE numloop; -- 跳出循环
		end IF;
		select nums;
		set nums = nums;1;
		ITERATE numloop; --等于java中的continue;此处可加可不加
	end loop numloop; -- 结束循环体
end //

call loops(1)

********* 如果直接写成这样的话 就是死循环
numloop:loop
		if 1 > 5
		then LEAVE numloop;
		end IF;
end loop numloop;
***************************
mysql查询循环进程;show PROCESSLIST
杀掉id;kill 5


例子;打印 1,2,3,4,5,6,7,8,9
delimiter //
CREATE PROCEDURE loops3()
BEGIN
	DECLARE indexs int DEFAULT 1;
	DECLARE conts VARCHAR(32) DEFAULT(;;);
	cnt:loop
		if indexs < 10 then
			if indexs = 1 then 
			 set conts = ;1;;
			 set indexs = indexs ;1;
			ELSE
			 set conts = CONCAT(conts,;,;,indexs);
			 set indexs = indexs ;1;
			END if;
		ELSE
			leave cnt;
		end if;
	end LOOP cnt;
	select conts;
end //


6.repeat  until (等同于java 的---> do  while)
delimiter //
CREATE PROCEDURE repeats()
BEGIN
	DECLARE indexx int DEFAULT 1;
	DECLARE star VARCHAR(256) DEFAULT ;1;;
	countlable:REPEAT    ----- do 
		set indexx = indexx ;1;
		set star = concat(star,;,;,indexx);
		until indexx >= 10  ----- while   indexx > = 10
	end REPEAT countlable;
	SELECT star;
END //

call repeats();



7.while do

delimiter //
CREATE PROCEDURE whiles()
BEGIN
	DECLARE  indexx int DEFAULT 1;
	DECLARE  str VARCHAR(255) DEFAULT ;1;;
	while indexx < 10 do
		set indexx = indexx ;1;
		set str = CONCAT(str,;,;,indexx);
	END WHILE;
	select str;
END //

call whiles();

8.游标
-- 声明语法 将select_statement( select 查询结果集 ) 结果集赋值给游标 cursor_name
DECLARE cursor_name CURSOR for select_statement

-- 打开语法
OPEN cursor_name

-- 取值语法
FETCH cursor_name INTO varname

-- 关闭语法
CLOSE cursor_name


例子;
delimiter //
CREATE PROCEDURE curs(IN ids int)
BEGIN
	DECLARE nickname VARCHAR(32) ;
	DECLARE username VARCHAR(32) ;
	DECLARE statuss VARCHAR(32) ;
	-- 存错误信息
	DECLARE errss boolean DEFAULT true ; 
	-- 定义游标 并存放查询的结果集
	DECLARE cursorone  CURSOR for
		select a.nick_name,a.user_name,a.status from is_sys_user a where a.status = ids;
	-- handler 句柄 loop 循环到底就报错;这里接收 ;捕捉到错误就不再次循环了
	DECLARE CONTINUE HANDLER for NOT FOUND set errss = FALSE;
	-- 开启游标
	OPEN cursorone;
	-- loop 循环 通过fetch 取结果集的每一行数据赋值给变量
	ftechloop:loop
		fetch cursorone into nickname,username,statuss;
		-- 如果错误标识为true 说明fetch结果集没报错;
		if errss then
			select nickname,username,statuss;
		ELSE
			LEAVE ftechloop;
		end IF;
	end loop ftechloop;

END //

call curs(1)


//************
******* 书写顺序要求;变量声明;其次游标声明;最后 handler声明 *************
//************

============ 执行存储 为下个月每一天创建一个表;表名格式为 new_table_2022-03-04  ======








delimiter //
CREATE PROCEDURE next_month_add()
BEGIN
-- 年
	DECLARE yearint int ;
-- 月
	DECLARE monthint int ;
-- 日
	DECLARE dayint int ;
-- 每日的表名
	DECLARE tablename VARCHAR(32) ;
-- 月字符串
	DECLARE monthstr VARCHAR(32) ;
-- 日字符串
	DECLARE daystr VARCHAR(32) ;
	
-- index 变量 类似 java  i
	DECLARE indexi int  DEFAULT 1;
	
-- 获取当前年份
	set yearint = YEAR(DATE_ADD(now(),INTERVAL 1 MONTH));
-- 获取下个月的月份
	set monthint = MONTH(DATE_ADD(now(),INTERVAL 1 MONTH));
-- 获取下个月最后一天是几号(下个月有几天)
	set dayint =  DAYOFMONTH(LAST_DAY(DATE_ADD(now(),INTERVAL 1 MONTH)));

-- 判断月份是否小于10
	if monthstr < 10 then
		-- 月字符串赋值
		set monthstr = CONCAT(;0;,;;,monthint); 
	ELSE
		set monthstr = monthint;
	end IF;
	
-- 循环天数
	while indexi <= dayint do
	-- 判断日期是否小于10
		if indexi < 10 then
			set daystr = CONCAT(;0;,;;,indexi); 
		ELSE
			set daystr = indexi;
		end IF;
		
-- new_table_2022-03-04 这种格式
		set tablename = CONCAT( ;new_table; ,;_;,CONCAT( CONCAT(yearint,;_;,monthint) , ;_; , daystr ) ); 
-- 创建数据表;必须先拼接创建表的语句
		set ;create_table_sql = CONCAT(;CREATE TABLE ;,
																	tablename,
																	; (
  ;id; bigint NOT NULL COMMENT ;主键;,
  ;create_time; datetime DEFAULT NULL COMMENT ;创建时间;,
  ;update_time; datetime DEFAULT NULL COMMENT ;更新时间;,
  ;create_by; varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ;创建人;,
  ;update_by; varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ;更新人;,
  PRIMARY KEY (;id;) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT=;自动生成表表;;;
																	);
		-- 预编译
		PREPARE create_table_stmt  FROM ;create_table_sql;
		-- 执行
		execute create_table_stmt;
		-- 释放数据库连接
		DEALLOCATE PREPARE create_table_stmt;
		
		set indexi = indexi ;1;
	end WHILE;

END //

drop PROCEDURE next_month_add

call next_month_add()

加载全部内容

相关教程
猜你喜欢
用户评论
快盘暂不提供评论功能!