IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 数据库学习笔记Day03--01存储过程,流程控制,游标 -> 正文阅读

[大数据]数据库学习笔记Day03--01存储过程,流程控制,游标

存储过程

创建

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指令以及多个存储过程中共享使用,建议少用。

存储过程的参数

共有三种 in\out\inout

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;

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-02-06 13:53:32  更:2022-02-06 13:55:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 14:04:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码