SQL之存储过程学习

文章目录

  • 前言
  • 一、存储过程的定义
    • 1、系统存储过程
    • 2、本地存储过程
    • 3、临时存储过程
    • 4、远程存储过程
    • 5、扩展存储过程
  • 二、创建存储过程语法
    • 1.简单示例
  • 三、调用存储过程
  • 四、删除存储过程
  • 四、存储过程的优缺点
    • 优点
    • 缺点
  • 总结


前言

上一篇学习了SQL的DDL(数据定义语言)和DML(数据操作语言),接着我们来学习SQL的存储过程


一、存储过程的定义

存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的一个或多个SQL语句,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升。

1、系统存储过程

以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作。

2、本地存储过程

用户创建的存储过程是由用户创建并完成某一特定功能的存储过程,事实上一般所说的存储过程就是指本地存储过程。

3、临时存储过程

分为两种存储过程:
一是本地临时存储过程,以#字号(#)作为其名称的第一个字符,则该存储过程将成为一个存放在tempdb.数据库中的本地临时存储过程,且只有创建它的用户才能执行它;
二是全局临时存储过程,以两个#字号(##)号开始,则该存储过程将成为一个存储在tempdb.数据库中的全局临时存储过程,全局临时存储过程一旦创建,以后连接到服务器的任意用户都可以执行它,而且不需要特定的权限。

4、远程存储过程

在SQL Server2005中,远程存储过程(Remote Stored Procedures)是位于远程服务器上的存储过程,通常可以使用分布式查询和EXECUTE命令执行一个远程存储过程。

5、扩展存储过程

扩展存储过程(Extended Stored Procedures)是用户可以使用外部程序语言编写的存储过程,而且扩展存储过程的名称通常以xp_开头。

二、创建存储过程语法

CREATE PROC | PROCEDURE procedure_name
[{@参数数据类型}[=默认值][OUTPUT],
{@参数数据类型}[=默认值][OUTPUT],
....
]
AS
begin
     sql_statements

如何执行
Exec procedure_name

1.简单示例

CREATE PROC sp_test
@param1 INT,
@param2 VARCHAR( 16)
AS
SELECT * FROM test WHERE id=@param1
AND t_no=@param2 ;
Go
上面就是一个简单的示例。

注意:存储过程在创建阶段可以带参数或不带参数,不带参数的一般是执行一些不需要传递参数的语句就可以完成的功能,带参数那就是需要传递参数的sQL语句,就像上面的示例,传递了两个参数给sQL语句。带参数的一定要定义参数类型,是字符型的还要定义长度,给参数加默认值是可选的。

注:“sp_test"为需要创建的存储过程的名字,该名字不可以以阿拉伯数字开头

三、调用存储过程

存储过程可以在三种环境下被调用:
1.command命令下,基本语法为: exec sp…name [参数名];
2.SQL环境下,基本语法为: call sp…name[参数名];
3.PL/SQL环境下,基本语法为: begin sp…name [参数名] end;

四、删除存储过程

1.基本语法:

drop procedure sp..name

⒉注意事项
不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程

四、存储过程的优缺点

优点

  1. 提高性能

SQL语句在创建过程时进行分析和编译。
存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划,这样,在执行过程时便可节省此开销。

  1. 降低网络开销

存储过程调用时只需用提供存储过程名和必要的参数信息,从而可降低网络的流量。

  1. 便于进行代码移植

数据库专业人员可以随时对存储过程进行修改,但对应用程序源代码却毫无影响,从而极大的提高了程序的可移植性。

  1. 增强安全性
    提高代码安全,防止 SQL注入。这一点sql语句也可以做到。

缺点

  1. SQL本身是一种结构化查询语言,但不是面向对象的的,本质上还是过程化的语言,面对复杂的业务逻辑,过程化的处理会很吃力。同时SQL擅长的是数据查询而非业务逻辑的处理,如果如果把业务逻辑全放在存储过程里面,违背了这一原则。

  2. 如果需要对输入存储过程的参数进行更改,或者要更改由其返回的数据,则您仍需要更新程序集中的代码以添加参数、更新调用,等等,这时候估计会比较繁琐了。

  3. 开发调试复杂,由于IDE的问题,存储过程的开发调试要比一般程序困难。

  4. 没办法应用缓存。虽然有全局临时表之类的方法可以做缓存,但同样加重了数据库的负担。如果缓存并发严重,经常要加锁,那效率实在堪忧。

  5. 不支持群集,数据库服务器无法水平扩展,或者数据库的切割(水平或垂直切割)。数据库切割之后,存储过程并不清楚数据存储在哪个数据库中。


总结

  1. 适当的使用存储过程,能够提高我们SQL查询的性能,

  2. 存储过程不应该大规模使用,滥用。

  3. 随着众多ORM 的出现,存储过程很多优势已经不明显。

  4. SQL最大的缺点还是SQL语言本身的局限性——SQL本身是一种结构化查询语言,我们不应该用存储过程处理复杂的业务逻辑——让SQL回归它“结构化查询语言”的功用。复杂的业务逻辑,还是交给代码去处理吧。

参考文章:https://www.cnblogs.com/wiggin-Z/p/10614497.html

你可能感兴趣的:(mysql,sql,学习,数据库)