/* MySQL-进阶18 
存储过程 和 函数
存储过程和函数:类似于java中的方法
好处:
1.提高代码的重用性
2.简化操作 */
#存储过程
/*
含义: 一组已经预见编译好的SQL语句的集合, 理解成批处理语句;
好处: 减少操作次数,减少了编译次数,减少了和服务器的连接次数,提高了效率 */
/*
#一: 创建语句
create procedure 存储过程名(参数列表)
begin
存储过程体(一组合法的SQL语法)
end 注意:
1.参数列表包含三个部分 : 参数模式 参数名 参数类型
举例:
in stuname varchar(20) 参数模式:
in : 该参数可以作为输入, 也就是该参数需要调用方 传入值
out : 该参数可以作为输出,也就是该参数可以作为返回值
inout : 该参数既可以作为输入也可以作为输出,也就是该参数既需要传入值,又需要返回值 2.如果存储过程体只有一句话,begin 和 end 可以省略;
存储过程体中的每条sql 语句的结尾要求必须加分号;
存储过程的结尾可以使用 delimiter 重新设置;
语法:
delimiter 结束标记
案例:
delimiter $
#二:调用语法
call 存储过程名(实参列表);
#二 :  删除存储过程
#语法:drop procedure 存储过程名 ,不支持删除多个
DROP PROCEDURE `myp1`; #三 : 查看 存储过程的信息
#错误写法:DESC myp2;
SHOW CREATE PROCEDURE myp2; #...................... #四: 修改 ,无法修改内部语句


*/

  #1.空参列表
#案例:插入到admin 表中五条记录
SELECT * FROM admin; DELIMITER $
CREATE PROCEDURE myp1()
BEGIN
INSERT INTO admin(`username`,`password`)
VALUES('a1',''),('a2',''),('a3',''),('a4',''),('a5','');
END $ #调用
CALL myp1() $; #2:创建带有in 模式参数的存储过程
#案例 : 创建存储过程实现 根据女生名,查询对应的男生信息
DELIMITER $
CREATE PROCEDURE myp2(IN beautyName VARCHAR(50))
BEGIN
SELECT bo.*
FROM boys bo
RIGHT JOIN beauty b
ON bo.id = b.boyfriend_id
WHERE b.name = beautyName;
END $
#调用 ,必须紧紧挨着'END $'
CALL myp2('柳岩') $; #案例2: 创建存储过程实现,用户是否登录成功
DELIMITER $
CREATE PROCEDURE myp3(IN `uname` VARCHAR(10),IN psw VARCHAR(10))
BEGIN
DECLARE result VARCHAR(20) DEFAULT ''; #声明局部变量并进行初始化
SELECT COUNT(*) INTO result #赋值
FROM admin
WHERE username = uname AND admin.`password`=psw; SELECT result;
END $
CALL myp3('lyt','') $; #返回1
#call myp3('lyt','') $; #返回0 #3-2:(使用IF 语句)创建存储过程实现,用户是否登录成功
DELIMITER $
CREATE PROCEDURE myp4(IN `uname` VARCHAR(10),IN psw VARCHAR(10))
BEGIN
DECLARE result INT DEFAULT 0; #声明局部变量并进行初始化
SELECT COUNT(*) INTO result #利用into 赋值
FROM admin
WHERE username = uname AND admin.`password`=psw; SELECT IF(result>0,'成功','失败'); #使用
END $
CALL myp4('lyt','') $; #返回 '失败'
# CALL myp4('lyt','') $; #返回 '成功' #3:创建带有out 模式参数的存储过程
#案例1:根据女神名,返回对应的男神名
DELIMITER $
CREATE PROCEDURE myp5(IN in_name VARCHAR(50),OUT boyName VARCHAR(20))
BEGIN
SELECT bo.boyName INTO boyName #赋值,重名时按照就近原则
FROM boys bo
INNER JOIN beauty b ON bo.`id`=b.`boyfriend_id`
WHERE b.name = in_name;
END $
#set @bname $ ,定义一个用户变量
CALL myp5('柳岩',@bname) $
SELECT @bname $; #鹿晗 #案例2:根据女神名,返回对应的男神名 和男神魅力值
DELIMITER $
CREATE PROCEDURE myp6(IN in_name VARCHAR(50),OUT boyName VARCHAR(20),OUT userCP INT)
BEGIN
SELECT bo.boyName ,bo.userCP INTO boyName,userCP
FROM boys bo
INNER JOIN beauty b ON bo.`id`=b.`boyfriend_id`
WHERE b.name = in_name;
END $
#set @bname $ ,定义一个用户变量
CALL myp6('柳岩',@bname,@usercp) $
SELECT @bname,@usercp $; #鹿晗 ,800 ##4.创建带inout 模式参数的存储过程
#案例1: 传入a 和 b两个值,最终a和b都翻倍并返回; 注意需要传入的需要是用户变量
DELIMITER $
CREATE PROCEDURE myp7(INOUT a INT,INOUT b INT )
BEGIN
SET a=a+a;
SET b=b+b;
END $ CALL myp7(@a,@b) $
SELECT @a,@b ; #24 26 SET @a=12;
SET @b=13;
#二 :  删除存储过程
#语法:drop procedure 存储过程名 ,不支持删除多个
DROP PROCEDURE `myp1`; #三 : 查看 存储过程的信息
#错误写法:DESC myp2;
SHOW CREATE PROCEDURE myp2; #...................... #四: 修改 ,无法修改内部语句
#------------------------------------------
COMMIT;

#五: 练习1-:

    ##练习1
#test1 : 创建一个存储过程实现传入一个日期,格式化为xx年xx月xx日 并返回
DELIMITER $
CREATE PROCEDURE test_pro4(IN mydate DATETIME,OUT strDate VARCHAR(50))
BEGIN
SELECT DATE_FORMAT(mydate,'%y年%m月%d日') INTO strDate;
END $ CALL test_pro4(@mydate,@strDate) $; SET @mydate=NOW();
SET @strDate='';
SELECT @mydate,@strDate; #2018-11-01 17:01:41,18年11月01日 ##练习2
#test2 : 创建一个存储过程或者函数实现传入女神名称,返回 女神 and 男神 名字加在一块的字符串
#如传入:小昭 ;返回:小昭 and 张无忌
COMMIT;
DROP PROCEDURE test_pro6; DELIMITER $
CREATE PROCEDURE test_pro7(IN s1 VARCHAR(50),OUT s2 VARCHAR(50))
BEGIN
SELECT CONCAT(s1,' and ',IFNULL(boys.`boyName`),'null')
FROM boys
INNER JOIN beauty b
ON b.`boyfriend_id`=boys.`id`
WHERE b.name=s1;
END $
#set @result1='' 可以省略!! CALL test_pro7('热巴',@result1) $ #返回 : 热巴 and 鹿晗
SELECT @result1; #六: 创建存储过程或者函数 ,根据传入的目录条数和起始索引(反了!),查询beauty表的记录
DELIMITER $
CREATE PROCEDURE test_pro8(IN size INT,IN startIndex INT)
BEGIN
SELECT * FROM beauty
LIMIT startIndex,size;
END $ CALL test_pro8(3,5) $

MySQL进阶18- 存储过程- 创建语句-参数模式(in/out/inout-对应三个例子) -调用语法-delimiter 结束标记'$'- 删除/查看/修改-三个练习的更多相关文章

  1. mysql进阶之存储过程

    往往看别人的代码会有这样的感慨: 看不懂 理还乱 是离愁 别是一番滋味在心头 为什么要使用存储过程? 在mysql开发中使用存储过程的理由: 当希望在不同的应用程序或平台上执行相同的函数,或者封装特定 ...

  2. MySQL进阶2 sql选择语句 where

    与SQL语句一致 #进阶2: 条件查询 /* 语法 select 查询列表 #3 from 表名 #1 where 筛选条件; #2 分类: 1.按条件表达式进行筛选 > < = != & ...

  3. mysql进阶(十九)SQL语句如何精准查找某一时间段的数据

    SQL语句如何精准查找某一时间段的数据 在项目开发过程中,自己需要查询出一定时间段内的交易.故需要在sql查询语句中加入日期时间要素,sql语句如何实现? SELECT * FROM lmapp.lm ...

  4. sqlserver查询所有表名、字段名、类型、长度和存储过程、视图的创建语句

    -- 获得存储过程创建语句 select o.xtype,o.name,cm.text from syscomments cm inner join sysobjects o on o.id=cm.i ...

  5. 基于ORACLE建表和循环回路来创建数据库存储过程SQL语句来实现

    一个.概要 在实际的软件开发项目.我们经常会遇到需要创造更多的相同类型的数据库表或存储过程时,.例如.假设按照尾号点表的ID号,然后,你需要创建10用户信息表,的用户信息放在同一个表中. 对于类型同样 ...

  6. MySQL中的存储过程和函数

    存储过程和函数 简单的说,存储过程就是一条或者多条SQL语句的集合.可以视为批文件,但是其作用不仅仅局限于批处理.本文主要介绍如何创建存储过程和存储函数,以及如何调用.查看.修改.删除存储过程和存储函 ...

  7. MySQL函数及存储过程

    MySQL函数及存储过程 参考文章:https://www.cnblogs.com/wupeiqi/articles/5713323.html 1.函数 1.1内置函数 官方文档:https://de ...

  8. MySQL进阶19--函数的创建(举例)/设置mysql的创建函数的权限/查看(show)/删除(drop) / 举4个栗子

    /*MySQL进阶19 函数 存储过程和函数:都类似于java中的方法; 存储过程和函数通用好处: 1.提高代码的重用性 2.简化操作 好处: 减少操作次数,减少了编译次数,减少了和服务器的连接次数, ...

  9. mysql 内置功能 存储过程 创建有参存储过程

    对于存储过程,可以接收参数,其参数有三类: #in 仅用于传入参数用 #out 仅用于返回值用 #inout 既可以传入又可以当作返回值 传入参数使用格式 in 变量 数据类型 返回值使用格式 out ...

随机推荐

  1. 时空卷积网络TCN

    1.写在前面 实验表明,RNN 在几乎所有的序列问题上都有良好表现,包括语音/文本识别.机器翻译.手写体识别.序列数据分析(预测)等. 在实际应用中,RNN 在内部设计上存在一个严重的问题:由于网络一 ...

  2. 高性能最终一致性框架Ray之基本功能篇

    一.Event(事件) Event是Actor产生的记录状态变化的日志,由StateId(状态Id),UID(幂等性控制),TypeCode(事件类型),Data(事件数据),Version(事件版本 ...

  3. tomcat 启动闪退解决方法

    当我们在windows上面进行项目的部署与启动的时候有的时候tomcat在进行启动的时候会删一下就退了,这个时候一般是里面启动的时候设置的jdk的问题下面咱们来看一下具体解决方案 编辑我们的start ...

  4. Eclipse使用JDBC方式连接SQLServer2017

    这篇博客写的比较详细了,图文并茂: https://blog.csdn.net/rebekahq/article/details/78691343 这里补充一些可能会遇到的问题: 1.与博客中不同之处 ...

  5. 双链表的基本实现与讲解(C++描述)

    双链表 双链表的意义 单链表相对于顺序表,确实在某些场景下解决了一些重要的问题,例如在需要插入或者删除大量元素的时候,它并不需要像顺序表一样移动很多元素,只需要修改指针的指向就可以了,其时间复杂度为 ...

  6. C++ 生成随机数总结 & C++ rand 函数使用方法

    1. 产生[0,b]之间的随机数 rand()*b / RAND_MAX; 2. 产生[-a,0]之间的随机数 rand()*(-a) / RAND_MAX; 3. 产生[a,b]之间的随机数 a + ...

  7. Python27之集合

    集合说:“在我的世界里,你就是唯一” 一.集合的概念和使用 集合的概念和数学里数学里集合的概念是一致的,都是一组元素的集,且元素之间不能重复.元素必须是不可变的数据类型,例如元组也可以作为其中的一个元 ...

  8. oracle如何保证数据一致性和避免脏读

      oracle通过undo保证一致性读和不发生脏读 1.不发生脏读2.一致性读3. 事务槽(ITL)小解 1.不发生脏读 例如:用户A对表更新了,没有提交,用户B对进行查询,没有提交的更新不能出现在 ...

  9. django修改表数据结构后报错的解决办法

    1.进入数据库删除app之前创建的表,如果删除有关联的表报错的话可以先删除其他表然后再删除因关联关系删除不了的表 2.删除django_migrations表中对应的app记录,删除命令delete ...

  10. jquery封装的方法

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...