我是靠谱客的博主 听话太阳,最近开发中收集的这篇文章主要介绍数据库学习笔记Day03 存储过程,流程控制,游标存储过程存储过程的参数存储过程中的流程控制存储过程的管理游标,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

存储过程

创建

DELIMITER //
CREATE PROCEDURE proc_1(IN a INT,IN b INT,OUT c INT)
BEGIN
   SET c = a+b;
END//

调用

SET @m=0;
CALL proc_1(3,2,@m);
SELECT @m FROM DUAL;

存储过程中的变量的使用

局部变量

DELIMITER //
CREATE PROCEDURE proc_2(IN a INT,OUT r INT)
BEGIN
DECLARE X INT DEFAULT 0;   -- 定义局部变量
DECLARE Y INT DEFAULT 1;
SET X=a*a;
SET Y=a/2;
SET r=X+Y;
END//

SELECT X FROM DUAL;

x,y为局部变量 查询不到,全局才可以

用户变量

DELIMITER //
CREATE PROCEDURE proc_2(IN a INT,OUT r INT)
BEGIN
DECLARE X INT DEFAULT 0;
DECLARE Y INT DEFAULT 1;
SET X=a*a;
SET Y=a/2;
SET r=X+Y;
END//

SET @m=1;
CALL proc_2(6,@m);
SELECT @m FROM DUAL

查询学生数量并返回

DELIMITER //
CREATE PROCEDURE proc_3(OUT c INT)
BEGIN
SELECT COUNT(stu_num) INTO c FROM students;--将查询结果赋值给c
END//
CALL proc_3(@m);
SELECT @m FROM DUAL;

使用变量注意事项

因为用户变量相当于全局变量,可以在SQL指令以及多个存储过程中共享使用,建议少用。

存储过程的参数

共有三种 inoutinout

in输入参数:在调用过程中传递数据给存储过程的参数

创建添加学生信息的存储过程:

DELIMITER //
CREATE PROCEDURE proc_4(IN snum INT,IN sname VARCHAR(20),IN sage INT,IN sgender CHAR(2),IN stel CHAR(11),IN sqq VARCHAR(11),IN sdate DATETIME,IN cid TINYINT)
BEGIN
INSERT INTO students(stu_num,stu_name,stu_age,stu_gender,stu_tel,stu_qq,stu_enterdate,cid) 
VALUES(snum,sname,sage,sgender,stel,sqq,sdate,cid);
END//

CALL proc_4(12,'sbb',30,'女','1558','7749',NOW(),3)

out输出参数:将存储过程在产生的数据返回给过程的调用者

创建根据学号,查学生姓名的存储过程

DELIMITER //
CREATE PROCEDURE proc_5(IN id INT,OUT sname VARCHAR(20))
BEGIN
SELECT stu_name INTO sname FROM students WHERE stu_num=id;
END//

SET @name='';
CALL proc_5(6,@name)
SELECT @name FROM DUAL 

inout参数

DELIMITER //
CREATE PROCEDURE proc_6(INOUT str VARCHAR(20))
BEGIN
SELECT stu_name INTO str FROM students WHERE stu_num=str; 
END//
SET @name-'6';
CALL proc_6(@name);
SELECT @name FROM DUAL

存储过程中的流程控制

分支语句

if-then-else语句

创建存储过程输入1,添加1条数据,else添加另一条数据

DELIMITER //
CREATE PROCEDURE proc_7(IN a INT)
BEGIN
  IF a=1 THEN
     INSERT INTO classes(class_name,class_size) VALUES('2101',24);
  ELSE
     INSERT INTO classes(class_name,class_size) VALUES('2102',66);
  END IF;
END//
CALL proc_7(1)
CALL proc_7(2)

case语句

DELIMITER //
CREATE PROCEDURE proc_8(IN a INT)
BEGIN
  CASE a
  WHEN 1 THEN
     INSERT INTO classes(class_name,class_size) VALUES('2003',24);
  WHEN 2 THEN
     INSERT INTO classes(class_name,class_size) VALUES('2004',44);
  ELSE
     INSERT INTO classes(class_name,class_size) VALUES('2005',34);
  END CASE;
END//
CALL proc_8(1);
CALL proc_8(3)

循环语句

while语句

创建存储过程,添加指定数目的班级信息

DELIMITER//
CREATE PROCEDURE proc_9(IN num INT)
BEGIN
  DECLARE i INT;
  SET i = 0;
  WHILE i<num DO 
    INSERT INTO students(stu_name,stu_age,stu_gender,stu_tel,stu_qq,stu_enterdate) VALUES('循环',55,'男','55','66',NOW());
    SET i=i+1;
  END WHILE;
END//
CALL proc_9(3)

repeat语句

DELIMITER//
CREATE PROCEDURE proc_10(IN num INT)
BEGIN
  DECLARE i INT;
  SET i = 0;
  REPEAT
    INSERT INTO students(stu_name,stu_age,stu_gender,stu_tel,stu_qq,stu_enterdate) VALUES('循环1',55,'男','55','66',NOW());
    SET i=i+1;
  UNTIL i>=num
  END REPEAT;
END//
CALL proc_10(3)

loop语句

DELIMITER//
CREATE PROCEDURE proc_11(IN num INT)
BEGIN
  DECLARE i INT;
  SET i = 0;
  myloop:LOOP
    INSERT INTO students(stu_name,stu_age,stu_gender,stu_tel,stu_qq,stu_enterdate) VALUES('循环2',55,'男','55','66',NOW());
    SET i=i+1;
    IF i=num THEN
       LEAVE myloop;
    END IF;
  END LOOP;
END//
CALL proc_11(3)

存储过程的管理

存储过程是属于数据库的,只能在本数据库中调用。

查询存储过程

SHOW PROCEDURE STATUS WHERE db='gyq';
SHOW CREATE PROCEDURE gyq.proc_2

修改存储过程

删除存储过程

drop删除数据库中的对象,数据库,数据表,列,存储过程,触发器,视图

delete删除表中的数据

DROP PROCEDURE proc_11

游标

游标可以逐条取出结果集中的每条数据

使用步骤:声明游标,打开游标 ,使用游标,关闭游标。

DELIMITER//
CREATE PROCEDURE proc_11(OUT result VARCHAR(2000))
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE sname VARCHAR(20);
DECLARE snum INT;
DECLARE sage INT;
DECLARE sqq VARCHAR(11);
DECLARE num INT;
DECLARE i INT;
DECLARE str VARCHAR(50);
DECLARE mycursor CURSOR FOR SELECT stu_name,stu_num,stu_age,stu_qq FROM students;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
SELECT COUNT(1) INTO num FROM students;
OPEN mycursor;
SET i=0;
WHILE i<=num DO
  FETCH mycursor INTO sname,snum,sage,sqq;
  SET i=i+1;
  SET str=CONCAT_WS('-',sname,snum,sage,sqq);
  SET result = CONCAT_WS(',',result,str);
END WHILE;
CLOSE mycursor;
END//
SET @str='';
CALL proc_11(@str);
SELECT @str FROM DUAL;

最后

以上就是听话太阳为你收集整理的数据库学习笔记Day03 存储过程,流程控制,游标存储过程存储过程的参数存储过程中的流程控制存储过程的管理游标的全部内容,希望文章能够帮你解决数据库学习笔记Day03 存储过程,流程控制,游标存储过程存储过程的参数存储过程中的流程控制存储过程的管理游标所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部