mysql--存储过程实战

举报
brucexiaogui 发表于 2021/12/30 01:39:49 2021/12/30
【摘要】 mysql--存储过程实战 一、存储过程格式 desc student delimiter //CREATE PROCEDURE 名称(参数列表) BEGIN SQL语句块END//delimiter ; 注意: 存储名称的参数列必须总是存在。如果没有参数,也该使用一个空参数列()。每个参数默认都是一个IN参数。参数类型要改变,...

mysql--存储过程实战

一、存储过程格式


  
  1. desc student
  2. delimiter //
  3. CREATE PROCEDURE 名称(参数列表)
  4. BEGIN
  5. SQL语句块
  6. END
  7. //
  8. delimiter ;

注意:

  • 存储名称的参数列必须总是存在。如果没有参数,也该使用一个空参数列()。每个参数默认都是一个IN参数。
  • 参数类型要改变,可在参数名之前使用关键词 OUT或INOUT

二、创建存储过程

例子:  


  
  1. delimiter //
  2. CREATE PROCEDURE pro1()
  3. BEGIN
  4. select * from student;
  5. END
  6. //
  7. delimiter ;
  8. call pro1();

解析:

 

(1)这里需要注意的是DELIMITER//和DELIMITER;两句,DELIMITER是分割符的意思,因为MySQL默认以”;”为分隔 符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先用DELIMITER关键字申明当 前段分隔符,这样MySQL才会将”;”当做存储过程中的代码,不会执行这些代码,用完了之后要把分隔符还原。 
(2)存储过程根据需要可能会有输入、输出、输入输出参数,这里有一个输出参数s,类型是int型,如果有多个参数用”,”分割开。 
(3)过程体的开始与结束使用BEGIN与END进行标识。 

三、存储过程定义

 

  • 声明变量: declare 变量名  数据类型 
  • 参数类型:

 

  1. in参数:输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
  2. OUT 输出参数:该值可在存储过程内部被改变,并可返回 
  3. INOUT 输入输出参数:调用时指定,并且可被改变和返回

四、无参数存储实例

 

  • 注意存储过程写好后,需要先运行一下。保存到数据库后,才可以调用这个存储过程,否则在调用的时候会报错,提示存储过程不存在。

  
  1. delimiter //
  2. CREATE PROCEDURE pro1()
  3. BEGIN
  4. select * from student;
  5. END
  6. //
  7. delimiter ;
  8. call pro1(); //调用无参数的存储过程

五、有参数存储过程实例

 

  • 参数类型为 in

  
  1. delimiter //
  2. CREATE PROCEDURE pro2(s_sex VARCHAR(10))
  3. BEGIN
  4. select * from student where sex=s_sex;
  5. END
  6. //
  7. delimiter ;
  8. set @s_sex='男';
  9. CALL pro2(@s_sex);

pro2存储过程使用了in类型的参数。在调用pro2存储过程时候,需要先给s_sex参数赋值(set @s_sex='男';),然后再调用pro2存储过程时将s_sex传入进去(CALL pro2(@s_sex);)。

 

  • 参数类型为 out

  
  1. delimiter //
  2. CREATE PROCEDURE pro3(out s_name varchar(20))
  3. BEGIN
  4. DECLARE s_name varchar(12);
  5. DECLARE department varchar(20);
  6. set s_name='测试1';
  7. set department='测试地址1';
  8. INSERT INTO student (s_name,department) values(s_name,department);
  9. END
  10. //
  11. delimiter ;

  
  1. set @s_name='张三强';
  2. CALL pro3(@s_name);
  3. select * from student;

测试结果:

调用pro3存储过程时给s_name参数赋值,但是在运行存储过程时,s_name参数值被改变了,说明了out类型的该值可在存储过程内部改变,并可以返回.往往是用于获取存储过程里的参数值

 

  • 参数类型为inout

  
  1. delimiter //
  2. CREATE PROCEDURE pro4(out s_name varchar(12),INOUT sex varchar(6),IN department varchar(13))
  3. BEGIN
  4. DECLARE sex VARCHAR(6)DEFAULT('男');
  5. set s_name='王明';
  6. set department='雄安新区';
  7. INSERT INTO student(s_name,sex,department)VALUES (s_name,sex,department);
  8. END
  9. //
  10. delimiter ;

  
  1. set @s_name='张三';
  2. set @department='北京';
  3. set @sex='女';
  4. CALL pro4(@s_name,@department,@sex);
  5. select * from student;

运行结果:

调用pro4存储过程,sex参数为inout类型在存储过程运行过程中改变了值的结果。

六、存储过程if判断语句

 

  • if条件使用格式

  
  1. if 条件 then
  2. 执行语句
  3. elseif 条件 then
  4. 执行语句
  5. else
  6. 执行语句
  7. end if;

 

存储过程if判断实例

 


  
  1. delimiter //
  2. CREATE PROCEDURE pro5(sex varchar(12))
  3. BEGIN
  4. DECLARE s_name varchar(12);
  5. DECLARE department varchar(21)DEFAULT '北京';
  6. IF sex='男' THEN
  7. set s_name='张三';
  8. INSERT INTO student (s_name,department) VALUES (s_name,department);
  9. ELSE
  10. set s_name='张丽丽';
  11. INSERT INTO student (s_name,sex,department) VALUES (s_name,sex,department);
  12. END IF;
  13. END
  14. //
  15. delimiter ;

pro5存储过程判断sex参数男,女。来改变插入数据的s_name名称。如果sex为男,则插入数据的s_name=张三。如果sex为女,则插入数据的s_name=张丽丽。

    ①、 sex=男,执行结果

 


  
  1. set @sex='男';
  2. CALL pro5(@sex);
  3. select * FROM student;

    ②、sex=女,执行结果


  
  1. set @sex='女';
  2. CALL pro5(@sex);
  3. select * FROM student;

七、存储过程while循环


  
  1. while 条件 do
  2. sql语句
  3. end while;

 

  • while循环实例

  
  1. delimiter //
  2. CREATE PROCEDURE pro6(count int)
  3. BEGIN
  4. DECLARE s_name varchar(12);
  5. DECLARE department varchar(20);
  6. DECLARE i int; -- 设置一个自增长变量i
  7. set i=1; -- 自增长i赋值
  8. WHILE i<=count DO
  9. SELECT CONCAT('变量i的值=',i); -- 查看每次循环i的值
  10. set s_name=CONCAT('测试',i); -- CONCAT()是个函数
  11. set department='测试地址1';
  12. INSERT INTO student (s_name,department) values(s_name,department);
  13. set i=i+1; -- 自增长i加1
  14. END WHILE;
  15. END
  16. //
  17. delimiter ;
CALL pro6(3);
 

pro6存储过程使用了while循环,在调用的时候需要传入循环的次数,结果会创建相应次数的数据。

 

八、查询存储过程

 

  • 查询有多少个存储过程:
SHOW PROCEDURE STATUS;
 
  •    查询某个存储过程详细信息

    


  
  1. SHOW CREATE PROCEDURE 存储过程名称;
  2. select * FROM information_schema.ROUTINES WHERE ROUTINE_NAME='存储过程名称';

 

 

 

 

 

 

 

文章来源: brucelong.blog.csdn.net,作者:Bruce小鬼,版权归原作者所有,如需转载,请联系作者。

原文链接:brucelong.blog.csdn.net/article/details/79786539

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。