什么是存储过程?有什么优点?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是存储过程?有什么优点?相关的知识,希望对你有一定的参考价值。
存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。
优点:
1、重复使用:存储过程可以重复使用,从而可以减少数据库开发人员的工作量。
2、减少网络流量:存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低了网络传输的数据量。
3、安全性:参数化的存储过程可以防止SQL注入式攻击,而且可以将Grant、Deny以及Revoke权限应用于存储过程。
扩展资料:
存储过程的缺点:
1、更改比较繁琐:如果更改范围大到需要对输入存储过程的参数进行更改,或者要更改由其返回的数据,则仍需要更新程序集中的代码以添加参数、更新 GetValue() 调用,等等,这时候估计比较繁琐。
2、可移植性差:由于存储过程将应用程序绑定到 SQL Server,因此使用存储过程封装业务逻辑将限制应用程序的可移植性。如果应用程序的可移植性在您的环境中非常重要,则需要将业务逻辑封装在不特定于 RDBMS 的中间层中。
参考资料来源:百度百科-存储过程
参考技术A 一、存储过程:存储过程是SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其它强大的编程功能。存储过程在创建时即在服务器上进行编译,所以执行起来比单个SQL语句快。
二、存储过程的优点:
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
3.存储过程可以重复使用,可减少数据库开发人员的工作量
4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权 参考技术B 存储过程是一组予编译的SQL语句
它的优点:1.允许模块化程序设计,就是说只需要创建一次过程,以后在程序中就可以调用该过程任意次。
2.允许更快执行,如果某操作需要执行大量SQL语句或重复执行,存储过程比SQL语句执行的要快。
3.减少网络流量,例如一个需要数百行的SQL代码的操作有一条执行语句完成,不需要在网络中发送数百行代码。
4.更好的安全机制,对于没有权限执行存储过程的用户,也可授权他们执行存储过程。本回答被提问者采纳 参考技术C 1. 运行速度:对于很简单的 sql ,存储过程没有什么优势。对于复杂的业务逻辑,因为在存储过程创建的时候,数据库已经对其进行了一次解析和优化。存储过程一旦执行,在内存中就会保留一份这个存储过程,这样下次再执行同样的存储过程时,可以从内存中直接调用,所以执行速度会比普通 s ql 快。 2. 减少网络传输:存储过程直接就在数据库服务器上跑,所有的数据访问都在数据库服务器内部进行,不需要传输数据到其它服务器,所以会减少一定的网络传输。但是在存储过程中没有多次数据交互,那么实际上网络传输量和直接 sql 是一样的。而且我们的应用服务器通常与数据库是在同一内网,大数据的访问的瓶颈会是硬盘的速度,而不是网速。 3. 可 维护性:的存储过程有些时候比程序更容易维护,这是因为可以实时更新 DB 端的存储过程 。 有些 bug ,直接改存储过程里的业务逻辑,就搞定了。 4. 增强安全性:提高代码安全,防止 SQL 注入 。这一点 sql 语句也可以做到。 5. 可扩展性:应用程序和数据库操作分开,独立进行,而不是相互在一起。方便以后的扩展和 DBA 维护优化。 参考技术D 作者:MrSky
链接:https://www.zhihu.com/question/21345483/answer/325288401
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
存储过程的定义:
一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
通过定义很容易知道存储过程的本质是SQL语集;因此如果你会SQL语句,其实你只需要再学习一些SQL存储过程里面的语法,关键字,你也就会使用存储过程了,和存储过程非常类似的触发器也是如此。
那么它有什么优缺点呢?
还是继续看定义“完成特定功能的SQL 语句集” “经过第一次编译后再次调用不需要再次编译”;是的,它可以完成特定的功能并且只需编译一次。
什么是特定的功能?
例如所有的业务逻辑,以及在进行入库的时候需要统一对入库数据进行格式化处理等等功能。
有过项目开发经历的同学应该知道,当我们将很多业务逻辑写在存储过程里面的时候,我们统一修改业务逻辑会非常方便。
我程序部署到正式服务器环境以后,如果这时候发现业务逻辑有问题,更改程序代码是很危险的事情,用“牵一发而动全身”来形容也不为过,而且由于本地测试代码和发布到正式环境的代码有诸多不同,因此临时更改代码非常危险。
如果我们将业务逻辑写在了存储过程里面,我们甚至无需要重新更改代码,重新编译,重新发布。我们直接更改数据库里面的存储过程就可以完成程序的相应更改,这大大方便了我们发布以后对程序的更改,增强了程序安全性。
因此存储过程的优点1:
实现特定的功能,将业务和程序代码进行分离,增强程序维护性。
存储过程详解
转自:https://blog.csdn.net/gaohuanjie/article/details/50996175
MySQL数据库在5.0版本后开始支持存储过程,那么什么是存储过程呢?怎么创建、查看和删除存储过程呢?存储过程有什么优点?这些是本章节要探讨的问题:
什么是存储过程:
简单的说存储过程是为了完成某个数据库中的特定功能而编写的语句集,该语句集包括SQL语句(对数据的增删改查)、条件语句和循环语句等。
创建存储过程:
存储过程的创建非常简单,其创建结构为:
- CREATE PROCEDURE proc_name ([proc_parameter[,...]])
- [characteristic]
- routine_body
说明:
proc_name代表存储过程名称;
proc_parameter代表存储过程参数列表。该列表中的每个参数由3部分组成,即输入输出类型、参数名称和参数类型。其形式如下: [ IN | OUT | INOUT ] param_name type ,其中[ IN | OUT | INOUT ]表示输出类型(IN表示输入参数;OUT表示输出参数; INOUT表示既可以是输入,也可以是输出。输入输出类型也可以去掉,默认为in); param_name表示参数名称(注意:MySQL数据库存储过程的参数名前不允许“@”,SQL Server数据库中可以);type表示参数类型,该类型可以是MySQL数据库的任意数据类型。
注意:MySQL数据库存储过程不需要在参数列表括号后面“as”关键字,但SQL Server数据库中的存储过程必须加“as”关键字。
characteristic指定存储过程的特性;该参数有多个值:
LANGUAGE SQL:说明routine_body部分是由SQL语言的语句组成,数据库系统默认值。
[NOT] DETERMINISTIC:指明存储过程的执行结果是否是确定的。DETERMINISTIC表示结果是确定的,这时当每次执行存储过程时相同的输入会得到相同的输出。NOT DETERMINISTIC表示结果是非确定的,这时相同的输入可能得到不同的输出。默认为非确定。
{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }:指明子程序使用SQL语句的限制。CONTAINS SQL表示子程序包含SQL语句,但不包含读或写数据的语句;NO SQL表示子程序中不包含SQL语句;READS SQL DATA表示子程序中包含读数据的语句;MODIFIES SQL DATA表示子程序中包含写数据的语句。默认为CONTAINS SQL。
SQL SECURITY { DEFINER | INVOKER }:指明谁有权限来执行。DEFINER表示只有定义者自己才能够执行;INVOKER表示调用者可以执行。默认为DEFINER。
COMMENT ‘string‘:存储过程注释信息。
routine_body参数为存储过程体,BEGIN…END标志存储过程体的开始和结束。存储过程体可以是SELECT、UPDATE、INSERT、DELETE、CREATE TABLE等SQL语句,也可以嵌入调用其它存储过程的代码,还可以是其它代码(参见博客:《数据库中的控制语句》)。
注意:不能在 MySQL 存储过程中使用 “return” 关键字。
示例一——使用存储过程创建表结构:
创建存储过程:
- DELIMITER &&
- CREATE PROCEDURE create_table ()
- LANGUAGE SQL
- BEGIN
- CREATE TABLE `user` (
- `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT ‘主键‘,
- `real_name` VARCHAR(8) NOT NULL COMMENT ‘姓名‘,
- `age` INT(3) DEFAULT NULL COMMENT ‘年龄‘,
- PRIMARY KEY (`id`)
- ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
- END &&
- DELIMITER ;
说明:上面创建了一个名称为create_table的存储过程;
注意:MySQL中默认的语句结束符为分号(;),存储过程中的SQL语句需要分号来结束,为了避免冲突,首先用"DELIMITER &&"将MySQL的结束符设置为&&,最后再用"DELIMITER ;"来将结束符恢复成分号。这与创建触发器是一样的。
调用存储过程:
- CALL create_table();
示例二——向创建好的表中添加数据:
创建存储过程:
- DELIMITER &&
- CREATE PROCEDURE insert_data (IN u_real_name VARCHAR(8), IN u_age INT(3), OUT u_id INT(11))
- LANGUAGE SQL
- BEGIN
- INSERT INTO USER (real_name, age)VALUES(u_real_name, u_age);
- SET u_id=LAST_INSERT_ID();#或SET [email protected]@IDENTITY;
- END &&
- DELIMITER ;
说明:上面创建的存储过程参数列表中u_real_name和u_age为输入变量,u_id为输出变量,该输出变量返回所添加数据对应的主键值;
调用存储过程:
- CALL insert_data(‘小明‘,21, @u_id);
- SELECT @u_id;
示例三——修改表中的数据:
创建存储过程:
- DELIMITER &&
- CREATE PROCEDURE update_data (IN u_id INT(11),IN u_real_name VARCHAR(8), IN u_age INT(3))
- LANGUAGE SQL
- BEGIN
- UPDATE USER SET real_name = u_real_name, age = u_age WHERE id = u_id;
- END &&
- DELIMITER ;
调用存储过程:
- CALL update_data(1,‘王佳佳‘,18);
示例四——依据姓名进行模糊查询获得符合条件的人数:
创建存储过程:
- DELIMITER &&
- CREATE PROCEDURE num_from_user (IN u_real_name VARCHAR(15), OUT count_num INT)
- READS SQL DATA
- BEGIN
- SELECT COUNT(*) INTO count_num FROM USER WHERE real_name LIKE u_real_name;
- END &&
- DELIMITER ;
说明:上面创建的存储过程参数列表中u_real_name为输入变量;count_num为输出变量。
SELECT语句从user表模糊查询real_name值等于u_real_name的记录,并用COUNT(*)统计符合条件的数据总数,然后将结果存入count_num中。
调用存储过程:
- SET @u_real_name=‘王%‘;
- CALL num_from_user(@u_real_name,@count_num);
- SELECT @count_num AS total;
说明:上面显示姓王的人数,其中@u_real_name和@count_num为用户名变量。
示例五——依据主键id删除数据:
创建存储过程:
- DELIMITER &&
- CREATE PROCEDURE delete_data (IN u_id INT(11), OUT effect_number INT(3))
- LANGUAGE SQL
- BEGIN
- DELETE FROM USER WHERE id = u_id;
- SET effect_number = ROW_COUNT();#ROW_COUNT()用于返回受影响的行数
- END &&
- DELIMITER ;
调用存储过程:
- CALL delete_data(1, @effect_number);
- SELECT @effect_number;
查看存储过程:
存储过程的查看可以通过如下语句实现:SHOW PROCEDURE STATUS WHERE db=‘数据库名‘;或SHOW CREATE PROCEDURE 数据库名.存储过程名;
删除存储过程:
存储过程的删除可以通过如下语句实现:DROP PROCEDURE 存储过程名
存储过程优点:
1、存储过程增强了SQL语言灵活性。存储过程可以使用控制语句编写,可以完成复杂的判断和较复杂的运算,有很强的灵活性;
2、减少网络流量,降低了网络负载。存储过程在数据库服务器端创建成功后,只需要调用该存储过程即可,而传统的做法是每次都将大量的SQL语句通过网络发送至数据库服务器端然后再执行;
3、存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
4、系统管理员通过设定某一存储过程的权限实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。
以上是关于什么是存储过程?有什么优点?的主要内容,如果未能解决你的问题,请参考以下文章