存储过程和函数
文章已同步至GitHub开源项目: Java超神之路
变量
-
系统变量
SHOW [GLOBAL/SESSION] VARIVALES
? 条件查询 SHOW [GLOBAL/SESSION] LIKE '%char%'
查看某个变量的值 SELECT @@[GLOBAL/SESSION].系统变量名
设置值 SET [GLOBAL/SESSION].系统变量名 = 值;
-
自定义变量
存储过程
-
概念 一组预先编译好的SQL语句集合。 -
好处
- 提高代码的通用性
- 简化操作
- 减少了编译次数和连接次数,提高效率
-
语法
-
例子
-
插入到book中五条记录
CREATE PROCEDURE INSERT5()
BEGIN
INSERT INTO book values (1,'计算机网络',45.9,'罗贯中',NOW());
INSERT INTO book values (2,'计算机网络',45.9,'罗贯中',NOW());
INSERT INTO book values (3,'计算机网络',45.9,'罗贯中',NOW());
INSERT INTO book values (4,'计算机网络',45.9,'罗贯中',NOW());
INSERT INTO book values (5,'计算机网络',45.9,'罗贯中',NOW());
END;
CALL INSERT5();
-
根据工资查询员工
CREATE PROCEDURE getBySalary(IN s double)
BEGIN
SELECT *
FROM employees
WHERE salary = s;
END;
CALL getBySAlary();
-
根据工资返回员工名
CREATE PROCEDURE getNameBySalary(IN salary double,OUT name VARCHAR(20))
BEGIN
SELECT last_name INTO name
FROM employees
WHERE employees.salary = salary;
END;
SET @result;
CALL getNameBySalary(24000,@result);
SELECT @result;
函数
? 有且仅有一个返回
-
有参有返回 根据员工名返回工资
CREATE FUNCTION getSalaryByName(name VARCHAR(20)) RETURNS DOUBLE
BEGIN
DECLARE salary DOUBLE;
SELECT e.salary INTO salary
FROM employees e
WHERE e.last_name = name;
RETURN salary;
END;
SELECT getSalaryByName('K_ing');
流程控制结构
分支结构
-
IF(表达式 1,表达式2,表达式3) 如果表达式1成立,返回2,否则返回3 -
CASE结构 如果ELSE省略 当都不匹配时 返回NULL
CASE 表达式/值/字段
WHEN 常量1 THEN 语句1;
WHEN 常量2 THEN 语句2;
ELSE 默认语句;
END;
CASE
WHEN 条件 THEN 语句;
WHEN 条件 THEN 语句;
ELSE 默认语句;
END;
案例: 创建函数,根据传入成绩,显示等级
CREATE FUNCTION wage_scale(score DOUBLE) RETURNS varchar(10)
BEGIN
CASE
WHEN score>=90 THEN RETURN '优秀';
WHEN score>=80 THEN RETURN '良好';
WHEN score>=70 THEN RETURN '普通';
WHEN score>=60 THEN RETURN '及格';
ELSE RETURN '不及格';
END CASE;
END;
SELECT wage_scale(90);
循环结构
WHILE
案例:根据次数批量插入admin表数据
CREATE PROCEDURE pro_while(IN count INT)
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i <= count
DO
INSERT INTO admin (username, password) VALUES (count, count);
SET i = i + 1;
END WHILE;
end;
CALL pro_while(10);
LOOP 可以用来模拟简单的死循环
REPEAT
案例
已知表content
创建存储过程,插入指定数量的随机字符。
CREATE TABLE content(
id INT PRIMARY KEY AUTO_INCREMENT,
content VARCHAR(100)
);
CREATE PROCEDURE random_content(IN count INT)
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i <= count DO
INSERT INTO content VALUES (null,random_bytes(100));
SET i = i+1;
END WHILE;
END;
CALL random_content(100);
文章已同步至GitHub开源项目: Java超神之路 更多Java相关知识,欢迎访问!
|