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()