Py学习  »  DATABASE

MySQL~存储过程基本操作

not declined • 3 年前 • 77 次点击  
delimiter $         -- 声明sql语句的分隔符,默认情况下是;
CREATE  PROCEDURE p()
BEGIN
SELECT 'hello procedure';
END$
call p()
-- -----------------                  注释符后空一格

delimiter $
CREATE PROCEDURE process_01()
BEGIN
DECLARE nickname VARCHAR(18) DEFAULT('大哥哥');    -- 声明变量,默认值为‘大哥哥’
SET nickname = '小弟弟';        -- 直接赋值
SELECT nickname;
END$

DROP PROCEDURE process_01;  -- 删除该存储过程

CALL process_01()       -- 调用该存储过程

-- INTO------------------
delimiter $
CREATE PROCEDURE process_02()
BEGIN
DECLARE num int;
SELECT COUNT(*) INTO num FROM  sinfo;        -- INTO 将SELECT COUNT(*) FROM  sinfo;的查询结果传递给num  
SELECT CONCAT('sinfo表中的元组数为 ', num);
END$

DROP PROCEDURE process_02;

call process_02


-- ------------------
delimiter $
CREATE PROCEDURE process_03()
BEGIN
SET @nickname = '小弟弟';
END$ 

DROP PROCEDURE process_03;

call process_03

SELECT @nickname;
-- ---------------------
	-- IN	该参数可作为输入
	-- OUT	该参数可作为输出
	-- INOUT	即可输入也可输出
delimiter $
CREATE PROCEDURE process_04(in height int)
BEGIN
	DECLARE description VARCHAR(30) DEFAULT('没身高');
	if height >= 180 then
	set description = '身材高挑';
	elseif height >= 170 and height < 180 then     -- 注意elseif不能分开
	set description = '标准身材';
	else
	set description = '一般身材';
	end if;																				-- 结束if
	
	SELECT height;
	SELECT description;
END$

DROP PROCEDURE process_04;

call process_04(190);														-- 调用时传入
call process_04(170);
call process_04(160);
-- if语句-------------------
	-- IN	该参数可作为输入
	-- OUT	该参数可作为输出
	-- INOUT	即可输入也可输出
delimiter $
CREATE PROCEDURE process_05(inout height int, out description VARCHAR(12) )
BEGIN

	if height >= 180 then
	set description = '身材高挑';
	elseif height >= 170 and height < 180 then     
	set description = '标准身材';
	else
	set description = '一般身材';
	set height = 172;


    
          -- 长高了,使用inout将传递这个值出来
	set description = '标准身材';
	end if;																				-- 
END$

DROP PROCEDURE process_05;

set @height = 190;
call process_05(@height,@description);		-- @description 用户会话变量,代表整个会话过程都有用,类似全局变量
SELECT @height;														-- @@description 系统变量
SELECT @description;	

set @height = 170;
call process_05(@height,@description);
SELECT @height;		
SELECT @description;

set @height = 160;
call process_05(@height,@description);
SELECT @height;		
SELECT @description;
-- CASE语句-----------------
delimiter $
CREATE PROCEDURE process_06(mon int)
BEGIN
DECLARE result VARCHAR(10);
CASE 
	WHEN mon >=1 and mon<=3  THEN
		set result = '第一季度';
	WHEN mon >=4 and mon<=6  THEN
		set result = '第二季度';
	WHEN mon >=7 and mon<=9  THEN
		set result = '第三季度';
	ELSE
		set result = '第四季度';
END CASE;
	SELECT CONCAT('传递的月份为 ',mon,'所属季度是 ',result);
end$
call  process_06(7);
-- while循环-------------						不满足条件则退出循环
delimiter $
CREATE PROCEDURE process_07(n int)
BEGIN
DECLARE total int DEFAULT 0;
DECLARE num int DEFAULT 1;
WHILE num <= n DO													-- 累加1~n的值
	set total = total + num;
	set num = num + 1;
END WHILE;
SELECT CONCAT('累计后的值为 ',total);
end$
DROP PROCEDURE process_07;
call  process_07(10);
-- repeat循环----------------      满足条件则退出循环
delimiter $
CREATE PROCEDURE process_08(n int)
BEGIN
DECLARE total int DEFAULT 0;
REPEAT
	set total = total + n;
	set n = n -1;
UNTIL n = 0 END REPEAT;						--  满足条件则退出循环
SELECT CONCAT('累计后的值为 ',total);
end$
DROP PROCEDURE process_08;
call  process_08(10);
-- loop语句--------------					使用leave语句推出循环
delimiter $
CREATE PROCEDURE process_09(n int)
BEGIN
DECLARE total int DEFAULT 0;
c:loop
	set total = total + n;
	set n = n -


    
1;
	if n<=0 then
	LEAVE c;                        -- 	使用leave语句推出循环
	end if;
end loop c;	
SELECT CONCAT('累计后的值为 ',total);
end$
DROP PROCEDURE process_09;
call  process_09(10);
-- 游标------------------            
-- 用来存储查询结果集的数据类型,在存储过程和函数中可以使用光标对结果集进行循环的处理。
-- 光标的使用包括光标的声明、OPEN、FETCH和CLOSE,其语法分别如下。
delimiter $
CREATE PROCEDURE process_10()
BEGIN
DECLARE sinfo_name VARCHAR(12);        -- 定义接收变量
DECLARE sinfo_number int;
DECLARE num int DEFAULT(1);
DECLARE n int DEFAULT(0);
DECLARE sinfo_result CURSOR for SELECT * from sinfo;    -- 定义游标
SELECT COUNT(*) INTO num FROM sinfo;
open sinfo_result;            -- 打开游标
c: LOOP
	FETCH sinfo_result into sinfo_name,sinfo_number;
  SELECT CONCAT('name:',sinfo_name,' number:',sinfo_number);
	set n = n + 1;
	IF n >= num THEN
		LEAVE c; 
	END IF; 
END LOOP c;
CLOSE sinfo_result;           -- 关闭游标
end$
DROP PROCEDURE process_10;
call  process_10();
-- 							<--- fetch   每fetch一次执行下一行
-- 吕布	20      			 |
-- ddd	21						 |
-- aaa	21						\|/	
-- n	7
-- hh	12
-- 韩信	1
-- 王老五	123

-- 存储函数-----------------
SET GLOBAL log_bin_trust_function_creators = 1;   --下方单独一个存储函数无法运行,需设置,下方链接为原因
delimiter $
create FUNCTION fun1(num int)
RETURNS int
BEGIN
DECLARE sum int DEFAULT(0);
SELECT COUNT(*) INTO sum FROM sinfo where number = num;
return sum;
end$

drop FUNCTION fun1;
SELECT fun1(21);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214

链接:
[https://blog.csdn.net/maweiba163/article/details/51895323]

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/99419
 
77 次点击