SQL存储过程(Stored Procedure)

什么是存储过程?

  • 存储过程(procedure)类似于C语言中的函数
  • 用来执行管理任务或应用复杂的业务规则
  • 存储过程可以带参数,也可以返回结果
  • 存储过程可以包含数据操纵语句、变量、逻辑 控制语句等

存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。外部程序可以直接调用数据库里面定义好的存储过程,另外数据库内部的触发器(trigger)、或者其他存储过程也可以调用它。

存储过程的优点

(1)执行速度快:存储过程创建是就已经通过语法检查和性能优化,在执行时无需每次编译。存储在数据库服务器,性能高。

(2)允许模块化设计:只需创建存储过程一次并将其存储在数据库中,以后即可在程序中调用该过程任意次。存储过程可由在数据库编程方面有专长的人员创建,并可独立于程序源代码而单独修改 。

(3)提高系统安全性:可将存储过程作为用户存取数据的管道。可以限制用户对数据表的存取权限,建立特定的存储过程供用户使用,完成对数据的访问。

    存储过程的定义文本可以被加密,使用户不能查看其内容。

(4)减少网络流量:一个需要数百行Transact-SQL代码的操作由一条执行过程代码的单独语句就可实现,而不需要在网络中发送数百行代码。

存储过程的缺点

1、存储过程会使得 数据库占用的系统资源加大(cpu、memory),数据库毕竟主要用来做数据存取的,并不进行复杂的业务逻辑操作。
2、因为存储过程依旧是sql,所以没办法像编程语言那样写出复杂业务逻辑对应的存储过程。
3、存储过程不容易进行调试。
4、存储过程书写及维护难度都比较大。

 存储过程的分类

  • 系统存储过程
  • 由系统定义,存放在master数据库中
  • 类似C语言中的系统函数
  • 系统存储过程的名称都以“sp_”开头或”xp_”开头
  • 用户自定义存储过程
  • 由用户在自己的数据库中创建的存储过程
  • 类似C语言中的用户自定义函数

关于MySQL的存储过程

存储过程是数据库存储的一个重要的功能,但是MySQL5.0以前并不支持存储过程,这使得MySQL在应用上大打折扣。好在MySQL 5.0终于开始已经支持存储过程,这样即可以大大提高数据库的处理速度,同时也可以提高数据库编程的灵活性。

一、MySQL存储过程的创建

 通过MySQL提供的Query browser来创建

1、首先我们通过Administrator在test 数据库中创建一个简单的表名叫”products“的,里面包括下面这两个字段:

 
2、然后打开Query Browser,并且在test中创建存储过程,存储过程名称为”GetAll“。
 
 
3、可以看到系统会默认加入一些内容。这些内容当然可以不用理会,我们的存储过程就是从BEGIN到END中间的那些。点击Continue可 以把存储进程加入到test数据库的目录中去。当然这里系统提供的代码也比较简单,一个就是重新定义存储过程代码的分隔符为”$$“,因为默认的是”; “而分号却是SQL的分隔符所以要重新定义一下分隔符,然后等存储过程写完后在把分隔符恢复为”;“。接着分隔符定义的下一句就是如果当前存在同名的进 程,则进行删除。在下面就是创建进程了。 
4、在begin和end之间 写入一行select代码
5、在右边的窗口中双击GetAll这个存储进程,并且执行,则得到下面这个结果

通过命令行创建

(1). 格式

MySQL存储过程创建的格式:

CREATE PROCEDURE 过程名 ([过程参数[,...]])

[特性 ...] 过程体

这里先举个例子:

mysql> DELIMITER //  
mysql> CREATE PROCEDURE proc1(OUT s int)  
    -> BEGIN 
    -> SELECT COUNT(*) INTO s FROM user;  
    -> END 
    -> //  
mysql> DELIMITER ;

注:(1)这里需要注意的是DELIMITER //DELIMITER ;两句,DELIMITER是分割符的意思,因为MySQL默认以";"为分隔符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先用DELIMITER关键字申明当前段分隔符,这样MySQL才会将";"当做存储过程中的代码,不会执行这些代码,用完了之后要把分隔符还原。

2)存储过程根据需要可能会有输入、输出、输入输出参数,这里有一个输出参数s,类型是int型,如果有多个参数用","分割开。

3)过程体的开始与结束使用BEGINEND进行标识。

(2). 声明分割符

其实,关于声明分割符,上面的注解已经写得很清楚,不需要多说,只是稍微要注意一点的是:如果是用MySQLAdministrator管理工具时,可以直接创建,不再需要声明。

(3). 参数

MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT,形式如:

CREATE PROCEDURE([[IN |OUT |INOUT ] 参数名 数据类形...])

  • IN 输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
  • OUT 输出参数:该值可在存储过程内部被改变,并可返回
  • INOUT 输入输出参数:调用时指定,并且可被改变和返回

. IN参数例子

创建:

mysql > DELIMITER //  
mysql > CREATE PROCEDURE demo_in_parameter(IN p_in int)  
-> BEGIN   
-> SELECT p_in;   
-> SET p_in=2;   
-> SELECT p_in;   
-> END;   
-> //  
mysql > DELIMITER ; 

 执行结果:

 mysql > SET @p_in=1;  
mysql > CALL demo_in_parameter(@p_in);  
+------+  
| p_in |  
+------+  
|   1  |   
+------+  
+------+  
| p_in |  
+------+  
|   2  |   
+------+  
mysql> SELECT @p_in;  
+-------+  
| @p_in |  
+-------+  
|  1    |  
+-------+   

以上可以看出,p_in虽然在存储过程中被修改,但并不影响@p_id的值

.OUT参数例子

创建:

mysql > DELIMITER //  
mysql > CREATE PROCEDURE demo_out_parameter(OUT p_out int)  
-> BEGIN
  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值