登录全球最大的域名注册商网站,网站类型大全,长沙网站免费建站,wordpress mu 2017文章目录存储过程语法格式BEGIN...END语句块DECLARE#xff08;声明局部变量#xff09;流控制语句if函数批处理操作测试2测试3存储过程与函数的关系存储过程
MYSQL的存储过程是一组预处理的SQL语句#xff0c;可以像函数一样在数据库中进行存储和调用。
它们允许在数据库…
文章目录存储过程语法格式BEGIN...END语句块DECLARE声明局部变量流控制语句if函数批处理操作测试2测试3存储过程与函数的关系存储过程
MYSQL的存储过程是一组预处理的SQL语句可以像函数一样在数据库中进行存储和调用。
它们允许在数据库中定义一系列的操作然后通过简单的调用来执行这些操作。而不必每次重写相同的SQL语句。
存储过程通常用于实现复杂的业务逻辑或执行繁杂的数据库操作。
语法格式 BEGIN…END语句块
存储过程可以使用begin… end… 复合语句来包含多个语句Statement_list 代表一个或者多个语句的列表
Statement_list 之间每个语句都必须用分号来结束 存储过程的调用要Call procedure_name().
示例 select * from user;-- 创建一个存储过程
-- 将语句分隔符改为// 使用完后要再改回
DELIMITER //
CREATE PROCEDURE GetUser(IN user_id INT)
BEGINselect * from user where id user_id;
END //-- 将语句分隔符再修改回
DELIMITER;-- 删除一个存储过程
DROP PROCEDURE GetUser;-- 调用一个存储过程
CALL GetUser(1);
DECLARE声明局部变量
DECLARE var_name[,...] type [DEFAULT value]不再需要符号
这个语句被用来声明局部变量
要给变量提供一个默认值要包含一个default 语句
值可以被指定为一个表达式不需要为一个常数
如果没有default子句初始值为NULL
局部变量的作用范围在他被声明的begin ... end语句块内。给局部变量更新值可以使用SET。-- 在存储过程内部可以定义局部变量
DELIMITER //
CREATE PROCEDURE test1() -- procedure
BEGIN DECLARE x INT; -- declare 声明DECLARE y INT;set x 1;set y 2;SELECT xy;
END //DELIMITER ;DROP PROCEDURE test1;call test1();mysql DELIMITER //
mysql CREATE PROCEDURE test1() -- procedure- BEGIN - DECLARE x INT;-- declare 声明- DECLARE y INT;- set x 1;- set y 2;- SELECT xy;- END//
Query OK, 0 rows affected (0.00 sec)mysql DELIMITER ;
mysql call test1();
------
| xy |
------
| 3 |
------
1 row in set (0.01 sec)Query OK, 0 rows affected (0.01 sec)
流控制语句
在MySQL中流控制语句用于控制程序的执行流程包括条件判断、循环和跳转。主要的流控制语句包括
IF-THEN-ELSE语句用于基于条件执行不同的代码块。 CASE语句用于基于多个条件执行不同的代码块。 WHILE循环当指定条件为真时重复执行一组语句。 REPEAT循环先执行一组语句然后重复执行直到指定条件为真。 LOOP循环无限循环直到遇到LEAVE语句跳出。
LEAVE语句用于从循环中跳出。 if函数
IF函数是一个MySQL内置函数它在条件为真时返回一个值否则返回另一个值。其基本语法如下 -- 测试if函数
SELECT if(1 5, ABC, abc);mysql SELECT if(1 5, ABC, abc);
-------------------------
| if(1 5, ABC, abc) |
-------------------------
| ABC |
-------------------------
1 row in set (0.00 sec)-- 测试concat 字符串的拼接函数
SET i:10;
select concat(10, ABC, 4564);mysql SET i:10;
Query OK, 0 rows affected (0.00 sec)mysql select concat(10, ABC, 4564);
---------------------------
| concat(10, ABC, 4564) |
---------------------------
| 10ABC4564 |
---------------------------
1 row in set (0.00 sec)
批处理操作
DELIMITER //
CREATE PROCEDURE BathInsert(IN num INT)
BEGINDECLARE x INT;set x 0;while x num doinsert into user(name, passward) values(concat(name, x), concat(passwd, x));set x x1;end while;
END //
DELIMITER ;CAll BathINsert(10);mysql DELIMITER //
mysql CREATE PROCEDURE BathInsert(IN num INT)- BEGIN- DECLARE x INT;- set x 0;- while x num do-
Display all 779 possibilities? (y or n) - insert into user(name, passward) values(concat(name, x), concat(passwd, x));-
Display all 779 possibilities? (y or n) - set x x1;- end while;- END //
Query OK, 0 rows affected (0.01 sec)mysql DELIMITER ;
mysql select * from user;
--------------------
| id | name | passward |
--------------------
| 1 | tom | 12345 |
| 2 | bob | 123456 |
| 3 | jack | 8888 |
--------------------
3 rows in set (0.00 sec)mysql CAll BathINsert(10);
Query OK, 1 row affected (0.05 sec)mysql select * from user;
---------------------
| id | name | passward |
---------------------
| 1 | tom | 12345 |
| 2 | bob | 123456 |
| 3 | jack | 8888 |
| 4 | name0 | passwd0 |
| 5 | name1 | passwd1 |
| 6 | name2 | passwd2 |
| 7 | name3 | passwd3 |
| 8 | name4 | passwd4 |
| 9 | name5 | passwd5 |
| 10 | name6 | passwd6 |
| 11 | name7 | passwd7 |
| 12 | name8 | passwd8 |
| 13 | name9 | passwd9 |
---------------------
13 rows in set (0.00 sec)
测试2
设置用户变量的rownum为0从score表中显示 s_ids_scorerownum如果c_id 等于 c_id, row_num row_num1,否则 等于 1因为 c_id没有定义数值所以第一次不会相同会赋值为1别名为 rrank ,c_id c_id 别名为 c_id 测试3 存储过程与函数的关系