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()
mysql 存储过程基础语法,整理下笔记
最新推荐文章于 2024-05-22 02:08:08 发布