关于存储过程

Posted icodes

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于存储过程相关的知识,希望对你有一定的参考价值。

什么是存储过程?

  • 存储过程(Stored Procedure)是在数据库系统中,一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程中的名字并给出参数(如果该存储过程带有参数)来执行它。
  • 存储过程不仅仅是"批处理"。
  • 存储过程是经过编译的SQL语句集。

 

存储过程与函数和触发器的区别?

  • 从语法上看,存储过程和函数以及触发器是十分类似的。我们甚至可以说,触发器和函数就是一种特殊的存储过程。不过它们之间还是有一些区别的。
  • 触发器用于完成一些触发条件所引起的操作。触发器的执行是自动化的。
  • 自定义函数只能通过return语句返回单个值或者表对象,而存储过程不能调用return语句,但是可以通过out参数返回多个值。函数可以在SQL语句中结合使用。函数不能用临时表,只能用表变量,还有一些系统函数都不可用等等。
  • 存储过程用于完成一系列的SQL操作,批量化的完成数据库操作工作,由使用者调用执行。

 

为什么使用存储过程?

  • 存储过程只在创造时进行编译,以后每次执行存储过程都不需要再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
  • 当对数据库进行复杂操作时(如对多个表进行Update、Insert、Query、Delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事物处理结合一起使用。这些操作,如果用程序来完成,就变成一条条的SQL语句,可能要多次连输数据库,而换作存储过程,只需要连接一次数据库就可以了。
  • 存储过程可以重复使用,可减少数据库开发人员的工作量。
  • 安全性高,可设定只有某用户才具有对指定存储过程的使用权限。

 

为什么不使用存储过程?

可移植性差。

  • 对于很简单的SQL语句,存储过程没有什么优势。
  • 存储过程中不一定会减少网络传输。
  • 如果只有一个用户使用数据库,那么存储过程从安全上讲也没什么优势。
  • 团队开发时需要先统一标准。否则后期维护时个麻烦。
  • 在大并发量访问的情况下,不宜写过多涉及运算的存储过程。
  • 业务逻辑复杂时,特别是涉及到对很大的表进行操作的时候,不如在前端先简化业务逻辑。

 

存储过程中变量定义

  • mysql中使用DECLARE进行变量定义。用法:DECLARE variable_name [,variable_name...] datatype [DEFAULT value]; 
  • 其中,dataype为MySQL的数据类型,例如: int, float, date, varchar(length)
  • 例如:
DECLARE I_int int unsigned default 4000000;

DECLARE I_numeric number(8,2) DEFAULT 9.95;

DECLARE I_date date DEFAULT ‘1999-12-31’;

DECLARE I_datetime datetime DEFAULT ‘1999-12-31 23:59:59‘;

DECLARE I_varchar varchar(255) DEFAULT ‘This will not be padded‘;

 

存储过程中变量赋值

MySQL中使用SET命令进行变量赋值。语法:SET 变量名 = 表达式 [,variable_name = expression ...]

注意:变量赋值是可以在不同存储过程中继承的。

mysql> SET @last_procedure=‘p1‘;

 

一个简单的例子

技术分享图片

以上是关于关于存储过程的主要内容,如果未能解决你的问题,请参考以下文章

如何在片段中使用 GetJsonFromUrlTask​​.java

sql中创建关于更新的存储过程

关于代码片段的时间复杂度

关于jdbc调用存储过程的问题

关于优化使用视图的存储过程的速度的建议

无法调用存储过程 错误代码 1305