数据库--存储过程
数据库–存储过程
文章目录
- 数据库--存储过程
- 1.存储过程简介
- 2.MySQL 存储过程概述
- 3.MySQL 存储过程的创建
- 4.MySQL 存储过程的调用
- 5.MySQL 存储过程的删除
- 6.MySQL 存储过程的控制语句
- 6.1变量作用域
- 6.2条件语句
- 6.3循环语句
- 7.MySQL 存储过程常用函数
- 7.1字符串函数:
- 7.2数学函数
- 7.3日期时间函数
1.存储过程简介
-
存储过程是一组为了完成特定功能的 SQL 语句集,经编译后存储在数据库中。
-
用户通过指定存储过程的名字并给定参数来调用执行。
-
存储过程可视为对编程中面向对象方法的模拟,允许控制数据的访问方式。
-
优点:
-
增强SQL语言的功能和灵活性:支持控制语句,完成复杂判断与运算。
-
标准组件式编程:可多次调用,修改存储过程不影响应用程序源代码。
-
较快的执行速度:预编译优化,执行计划存储在系统表中。
-
减少网络流量:只需传送调用语句,降低网络负载。
-
安全机制:通过权限限制实现对数据的访问控制。
-
2.MySQL 存储过程概述
- MySQL 5.0 开始支持存储过程。
- 提高了数据库编程的灵活性。
3.MySQL 存储过程的创建
- 语法:
CREATE PROCEDURE 过程名([[IN|OUT|INOUT] 参数名 数据类型, ...]) [特性 ...] 过程体
-
分隔符:
- 默认分隔符为
;
,需使用DELIMITER //
声明新分隔符,结束后再恢复为;
。
- 默认分隔符为
-
参数类型:
-
IN:输入参数,必须在调用时指定,修改不影响外部。
-
OUT:输出参数,可在存储过程内部修改并返回。
-
INOUT:输入输出参数,调用时指定,可修改并返回。
-
-
过程体:
- 使用
BEGIN
和END
标识开始与结束。
- 使用
-
变量声明:
DECLARE 变量名1[, 变量名2...] 数据类型 [默认值];
- 变量赋值:
SET 变量名 = 变量值;
-
用户变量:
- 以
@
开头,滥用会导致程序难以理解。
- 以
-
注释:
- 支持
--
单行注释。
- 支持
4.MySQL 存储过程的调用
CALL 过程名(参数);
5.MySQL 存储过程的删除
DROP PROCEDURE [过程1[, 过程2...]];
6.MySQL 存储过程的控制语句
6.1变量作用域
-
内部变量在作用域内优先,执行到
END
后消失。 -
可通过
OUT
参数或会话变量保存值。
6.2条件语句
- IF-THEN-ELSE
IF var = 0 THEN...
END IF;IF var = 0 THEN...
ELSE...
END IF;
CREATE procedure addstudent(SNo int,LPwd VARCHAR(20),SName VARCHAR(20),out res VARCHAR(20)
)
BEGINDECLARE n INT DEFAULT 0;SELECT COUNT(1) INTO n FROM student WHERE SName=StudentName ;IF n=0 THENINSERT INTO student (StudentNo,LoginPwd,StudentName) VALUES(SNo,Lpwd,Sname);SET res='新增成功';ELSESET res='新增失败';END IF;
ENDSET @res='';
CALL addstudent(1100,'123112','远远',@res);
SELECT @res;
- CASE-WHEN-THEN-ELSE
CASE varWHEN 0 THEN ...WHEN 1 THEN ...ELSE ...
END CASE;
CREATE PROCEDURE GetStudentLevel(student_id INT,subject_id INT )
BEGINSELECT StudentResult,CASEWHEN StudentResult >= 90 THEN '优秀'WHEN StudentResult >= 80 THEN '良好'WHEN StudentResult >= 60 THEN '及格'ELSE '不及格'END AS LevelFROM resultWHERE StudentNO = student_id AND SubjectNo = subject_id;
END CALL GetStudentLevel(100,1);
6.3循环语句
- WHILE-DO…END WHILE
WHILE var < 6 DO...
END WHILE;
CREATE PROCEDURE addstudent2(IN LPwd VARCHAR(20),IN SName VARCHAR(20),OUT res VARCHAR(20)
)
BEGINDECLARE n INT DEFAULT 0;DECLARE i INT DEFAULT 0;SELECT COUNT(1) INTO n FROM student WHERE StudentName = SName;IF n = 0 THENWHILE i < 3 DOINSERT INTO student (LoginPwd, StudentName) VALUES (LPwd, CONCAT(SName, i));SET i = i + 1;END WHILE;SET res = '新增成功';ELSESET res = '新增失败';END IF;
END SET @res = '';
CALL addstudent1('0725', '杨洋', @res);
7.MySQL 存储过程常用函数
7.1字符串函数:
CHARSET(str)
:返回字符集CONCAT(string2, ...)
:连接字符串INSTR(string, substring)
:返回子串位置LCASE(string2)
:转小写LEFT(string2, length)
:从左取字符LENGTH(string)
:字符串长度LOCATE(substring, string [, start])
:定位子串LPAD(string2, length, pad)
:左填充LTRIM(string2)
:去除前端空格REPEAT(string2, count)
:重复字符串REPLACE(str, search_str, replace_str)
:替换字符串RPAD(string2, length, pad)
:右填充RTRIM(string2)
:去除后端空格STRCMP(string1, string2)
:比较字符串SUBSTRING(str, position [, length])
:截取字符串TRIM(...)
:去除指定字符UCASE(string2)
:转大写RIGHT(string2, length)
:从右取字符SPACE(count)
:生成空格
7.2数学函数
ABS(number2)
:绝对值BIN(decimal_number)
:十进制转二进制CEILING(number2)
:向上取整CONV(number2, from_base, to_base)
:进制转换FLOOR(number2)
:向下取整FORMAT(number, decimal_places)
:保留小数位数HEX(DecimalNumber)
:转十六进制LEAST(number, number2, ...)
:求最小值MOD(numerator, denominator)
:求余POWER(number, power)
:求指数RAND([seed])
:随机数ROUND(number [, decimals])
:四舍五入SIGN(number2)
:返回正负号
7.3日期时间函数
ADDTIME(date2, time_interval)
:加时间间隔CONVERT_TZ(datetime2, fromTZ, toTZ)
:转换时区CURRENT_DATE()
:当前日期CURRENT_TIME()
:当前时间CURRENT_TIMESTAMP()
:当前时间戳DATE(datetime)
:返回日期部分DATE_ADD(date2, INTERVAL d_value d_type)
:加日期或时间DATE_FORMAT(datetime, FormatCodes)
:格式化日期DATE_SUB(date2, INTERVAL d_value d_type)
:减日期或时间DATEDIFF(date1, date2)
:日期差DAY(date)
:返回天数DAYNAME(date)
:英文星期DAYOFWEEK(date)
:星期几(1-7,1为周日)DAYOFYEAR(date)
:年中第几天EXTRACT(interval_name FROM date)
:提取日期部分MAKEDATE(year, day)
:生成日期串MAKETIME(hour, minute, second)
:生成时间串MONTHNAME(date)
:英文月份名NOW()
:当前时间SEC_TO_TIME(seconds)
:秒转时间STR_TO_DATE(string, format)
:字符串转时间TIMEDIFF(datetime1, datetime2)
:时间差TIME_TO_SEC(time)
:时间转秒数WEEK(date_time [, start_of_week])
:第几周YEAR(datetime)
:年份DAYOFMONTH(datetime)
:月中第几天HOUR(datetime)
:小时LAST_DAY(date)
:月最后一天MICROSECOND(datetime)
:微秒MONTH(datetime)
:月份MINUTE(datetime)
:分钟SQRT(number2)
:开平方