概述
存储过程
创建
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 存储过程,流程控制,游标存储过程存储过程的参数存储过程中的流程控制存储过程的管理游标所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复