函数、存储过程和视图
函数和存储过程的区别
函数也就是具有特定功能的代码块,而存储过程是指具有特定功能的Sal语句集合,函数有限制只能返回一个标量,而存储过程可以返回多个。并且函数是可以嵌入在SQL中使用的,可以在SELECT等SQL语句中调用,而存储过程不行。
自定义函数
1,当二进制日志启用后,这个变量就会启用。它控制是否可以信任存储函数创建者,不会创建写入二进制日志引起不安全事件的存储函数
2,使用delimiter;
delimiter修改结束符定义,将函数作为整体进行说明
create function 函数名称(获取值) returns 类型 begin 内容体 end
优点
1.运行速度:对于很简单的sal;存储过程没有什么优势。对于复杂的业务逻辑,因为在存储过程创建的时候,数据库已经对其进行了一次解析和优化。存储过程一旦执行,在内存中就会保留一份这个存储过程,这样下次再执行同样的存储过程时,可以从内存中直接调用,所以执行速度会比普通sgl快。
2.减少网络传输:存储过程直接就在数据库服务器上跑,所有的数据访问都在数据库服务器内部进行,不需要传输数据到其它服务器,所以会减少一定的网络传输。但是在存储过程中没有多次数据交互,那么实际上网络传输量和直接sgl是一样的。而且我们的应用服务器通常与数据库是在同一内网,大数据的访问的瓶颈会是硬盘的速度,而不是网速。
3.可维护性:的存储过程有些时候比程序更容易维护,这是因为可以实时更新DB端的存储过程。有些bug,直接改存储过程里的业务逻辑,就搞定了。
4.增强安全性:提高代码安全,防止SQL注入。这一点sal,语句也可以做到。
5.可扩展性:应用程序和数据库操作分开,独立进行,而不是相互在一起。方便以后的扩展和DBA维护优化
缺点
1.SQL本身是一种结构化查询语言,但不是面向对象的的,本质上还是过程化的语言,面对复杂的业务逻辑,过程化的处理会很吃力。同时SQL擅长的是数据查询而非业务逻辑的处理,如果把业务逻辑全放在存储过程里面,违背了这一原则。
2.如果需要对输入存储过程的参数进行更改,或者要更改由其返回的数据,则您仍需要更新程序集中的代码以添加参数、更新调用,等等,这时候估计会比较繁琐了。
3.开发调试复杂,由于IDE的问题,存储过程的开发调试要比一般程序困难。
4.没办法应用缓存。虽然有全局临时表之类的方法可以做缓存,但同样加重了数据库的负担。如果缓存并发严重,经常要加锁,那效率实在堪忧。
5.不支持群集,数据库服务器无法水平扩展,或者数据库的切割(水平或垂直切割)。数据库切割之后,存储过程并不清楚数据存储在哪个数据库中
存储过程
CREATE PROC[EDURE] <存储过程名称> -- 定义存储过程名称
[ @参数名称 参数类型] -- 定义传值参数及类型
[=default][OUTPUT][,...n1] -- 定义参数的属性:默认值,返回值
AS
SQL 语句[,...n2] --执行的操作
查看过程
EXEC [UTE] {存储过程名称} -- 查看存储过程名
[[@参数名称=]value | @variable [OUTPUT]|[DEFAULT][,...n1]} --参数名称
修改过程
ALTER PROC proc_student_ByIDAndName_Output
@Name nvarchar(5) OUTPUT
as
select @Name=sname from student
删除过程
DROP PROC[EDUTE] <存储过程名称> --删除存储过程名
[,...n]} --参数名称
存储过程命名规则 存储过程命名规则: pro_[小写表名][操作参数][操作关键字]
以 ‘pro_’ 为前缀 小写的表名 操作参数:举例,通过ID查询student,则为ByID 操作关键字: 如果存储过程返回一条记录那么后缀是:Select 如果存储过程插入数据那么后缀是:Insert 如果存储过程更新数据那么后缀是:Update 如果存储过程有插入和更新那么后缀是:Save 如果存储过程删除数据那么后缀是:Delete 如果存储过程更新表中的数据 (ie. drop and create) 那么后缀是:Create 如果存储过程返回输出参数或0,那么后缀是:Output
视图
异常
自定义异常
DECLARE senditien nema CONDITION FOR sondition value
senditienem:是自己起的名字,最好见名知意。
sonditien xelue:可以是SQLSThTE [VALUE] salat点xalue也可以是oaxsa xalue
saetat sxalue是长度为5的字符串错误代码。
axa axxs xalue.是数值类型的错误代码。
实例: DECLARE NO _TABLE CONDITION F0R 1146:
DECLARE handles type HANDLER FOR senditien value sp statement
hendles. suae:有三个取值4
CONTINUE:遇到错误不进行处理,跳过错误继续执行之后的代码。
EXIT:遇到错误时马上退出,不再执行之后的操作。出
UND0:遇到错误后撤回之前已经执行的操作,WySQL 暂不支持该操作。。
senditienxelus:错误名称:有以下取值”
senditien neme:定义异常时取的名字。
mysqlvelue:数值类型的错误代码
SQLARNING:对所有01开头的SQLSTAtE代码的速记
NOT FOUND: 对所有01开头的sqLstate代码的速记
SQLEXCEPTION:除SQLTARNING和NOT FOUND之外的SQLSTATE代码的速记。出
satetememt:异常之后的处理。
实例:出
DECLARE EXIT HANDLER FOR NO_ TABLE: