博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MYSQL中的存储过程
阅读量:5172 次
发布时间:2019-06-13

本文共 2470 字,大约阅读时间需要 8 分钟。

什么是存储过程

简单的说,就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法;

ps:存储过程跟触发器有点类似,都是一组SQL集,但是存储过程是主动调用的,且功能比触发器更加强大,触发器是某件事触发后自动调用;

 

有哪些特性

有输入输出参数,可以声明变量,有if/else, case,while等控制语句,通过编写存储过程,可以实现复杂的逻辑功能;

函数的普遍特性:模块化,封装,代码复用;

速度快,只有首次执行需经过编译和优化步骤,后续被调用可以直接执行,省去以上步骤;

创建一个简单的存储过程

存储过程proc_adder功能很简单,两个整型输入参数a和b,一个整型输出参数sum,功能就是计算输入参数a和b的结果,赋值给输出参数sum;

几点说明:

DELIMITER ;;:之前说过了,把默认的输入的结束符;替换成;;。

DEFINER:创建者;

-- ------------------------------ Procedure structure for `proc_adder`-- ----------------------------DROP PROCEDURE IF EXISTS `proc_adder`;DELIMITER ;;CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_adder`(IN a int, IN b int, OUT sum int)BEGIN    #Routine body goes here...    DECLARE c int;    if a is null then set a = 0;     end if;      if b is null then set b = 0;    end if;    set sum  = a + b;END;;DELIMITER ;

 

执行以上存储结果,验证是否正确,如下图,结果OK:

set @b=5;call proc_adder(2,@b,@s);select @s as sum;

 

存储过程中的控制语句

IF语句:

-- ------------------------------ Procedure structure for `proc_if`-- ----------------------------DROP PROCEDURE IF EXISTS `proc_if`;DELIMITER ;;CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_if`(IN type int)BEGIN    #Routine body goes here...    DECLARE c varchar(500);    IF type = 0 THEN        set c = 'param is 0';    ELSEIF type = 1 THEN        set c = 'param is 1';    ELSE        set c = 'param is others, not 0 or 1';    END IF;    select c;END;;DELIMITER ;

 

CASE语句:

-- ------------------------------ Procedure structure for `proc_case`-- ----------------------------DROP PROCEDURE IF EXISTS `proc_case`;DELIMITER ;;CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_case`(IN type int)BEGIN    #Routine body goes here...    DECLARE c varchar(500);    CASE type    WHEN 0 THEN        set c = 'param is 0';    WHEN 1 THEN        set c = 'param is 1';    ELSE        set c = 'param is others, not 0 or 1';    END CASE;    select c;END;;DELIMITER ;

 

循环while语句:

-- ------------------------------ Procedure structure for `proc_while`-- ----------------------------DROP PROCEDURE IF EXISTS `proc_while`;DELIMITER ;;CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_while`(IN n int)BEGIN    #Routine body goes here...    DECLARE i int;    DECLARE s int;    SET i = 0;    SET s = 0;    WHILE i <= n DO        set s = s + i;        set i = i + 1;    END WHILE;    SELECT s;END;;DELIMITER ;

 

其它:略~

 

存储过程弊端

不同数据库,语法差别很大,移植困难,换了数据库,需要重新编写;

不好管理,把过多业务逻辑写在存储过程不好维护,不利于分层管理,容易混乱,一般存储过程适用于个别对性能要求较高的业务,其它的必要性不是很大;

...

 

 

转载于:https://www.cnblogs.com/dengcl/p/7568479.html

你可能感兴趣的文章
异步编程的优势和难点
查看>>
P1008 三连击
查看>>
平衡树(模板+文艺平衡树)
查看>>
汉字注音符号学习(引用自维基百科)
查看>>
opencv_python学习笔记十三
查看>>
[封装] 修改NSString中部分字段的颜色
查看>>
void指针(void*)用法
查看>>
Android:TextView控件
查看>>
Shell与脚本
查看>>
理解和使用 JavaScript 中的回调函数
查看>>
使用Github pages+jekyll搭建自己的博客(windows版)
查看>>
Windows安装RabbitMQ集群的几个注意点
查看>>
CreateThread _beginThread _begintheadex AfxBeginThead思考
查看>>
个人作业-Alpha项目测试
查看>>
阿里云 Angular 2 UI框架 NG-ZORRO介绍
查看>>
IDEA 护眼色设置 背景行颜色取消等设置
查看>>
为Node.js编写组件的几种方式
查看>>
Binary Tree Postorder Traversal
查看>>
人脸数据库
查看>>
mysql内部代码的优缺点
查看>>