创建与使用存储过程
SQL.语句没有流程控制,无法实现复杂的应用,PL/SQL语言(Procedural Lan.guage/SQL)是将结构化查询与数据库过程控制结合为一体的强大语言,PL/SQL不但支持更多的数据类型,拥有变量声明、赋值语句,而且有选择、循环等流程控制语句。
系统开发过程中,经常会有同一个功能模块多次调用的情况,如果每次都编写代码会浪费大量的时间,为了解决这类问题,MySQL5.0开始引入存储过程。存储过程是一组为了完成特定功能的PL/SQL语句集,经编译后存储在数据库中,用户可以重复使用该存储过程,这样可以降低数据库开发人员的工作量。
游标是处理数据的一种方法,为了查看或处理结果集中的数据,游标提供了在结果集中一次一行浏览数据的能力。
事务是一个操作序列,这些操作要么都执行,要么都不执行,是一个不可分割的工作单元。
【任务6.1】 创建简单存储过程
1.PL/SQL的变量
变量。变量是指在程序运行过程中其值可以改变的量,包括用户变量、系统变量和局部变量。
1、用户变量。用户可以在PL/SQL中使用自己定义的变量,这样的变量称为用户变量。可以先在用户变量中保存一个数据,然后在以后的语句中引用该变量,这样就可以将数据从一条语句传递到另一条语句。用户变量在使用前必须定义和初始化,如果使用没有初始化的变量,其值为NULL。
2、系统变量。MySQL可以访问许多系统变量和连接变量,当服务器运行时许多变量可以动态更改。这样通常允许修改服务器操作而不需要停止并重启服务器。服务器维护两种变量,全局变量影响服务器整体操作,会话变量影响具体客户端连接的操作。
系统变量一般都以“@@”为前缀,如@@Version返回MySQL的版本。但某些特定的系统变量可以省略“@@”符号,如Current _Date、 Current _Time 和Current_User。
3、局部变量。在语句块(BEGIN到End之间)中定义的变量为局部变量,局部变量可以保存特定类型数据,其有效作用范围在存储过程和自定义函数的语句块中,在语句块结束以后,局部变量就失效了。
MySQL的局部变量必须先声明后使用。使用DECLARE语句声明局部变量,其声明语法格式为:
DECLARE<变量名称> 数据类型>[DEFAULT<默认值>];
说明:
1“DEFAULT”子句为变量指定默认值,若不指定则默认为NULL。2变量名称必须符合MySQL标识符的命名规则,在局部变量前面不使用“@”符号。
2.PL/SQL的运算符及表达式
1、运算符。运算符用于执行程序代码运算,会针对一个以上操作数项目进行运算。MySQL中的运算符主要有以下类型。
(1)算术运算符。算术运算符用于对表达式执行数学运算,操作数可以是任何数值
类型。 MySQL中的算术运算符有+(加)、一(减)、*(乘)、/(除)、%(取模)。
(2)赋值运算符。“=”是MySQL中的赋值运算符,可以将表达式的值赋给一个变量。
(3)比较运算符。比较运算符用于对两个表达式进行比较,数字以浮点值进行比较,字符串以不区分大小写的方式进行比较,若表达式成立则返回1,否则返回0。
MySQL中的比较运算符有=(等于)、>(大于)、<(小于)、>=(大于等于)、 (小于等于)、 (不等于)、!=(不等于)、<=>(相等或都等于空)。
(4)逻辑运算符。逻辑运算符用于对某些条件进行测试,以返回其真假。
MySQL中的逻辑运算符有And(与)、Or(或)、Not(非)。
(5)位运算符。位运算符用于对两个表达式执行二进制位操作。
MySQL中的位运算符有8.(位与)、(位或)、·(位异或)、~(位取反),>(位右移)、< (位左移)。
(6)一元运算符。一元运算符对一个操作数执行运算,该操作数可以是任何一种数据类型。
MySQL中的一元运算符有+(正)、一(负)和~(位取反)。2、表达式。表达式是由操作数、运算符、分组符号(括号)和函数构成的组合,MySQL可以对表达式进行运算以获取结果,一个表达式通常可以得到一个值。
表达式的值同样具有字符类型、数值类型、日期时间类型等,根据表达式的值类型可分为字符型表达式、数值表达式和日期表达式。3、运算符的优先级。当一个复杂的表达式有多个运算符时,运算符优先级决定执行运算的先后次序。执行的次序有时会影响所得到的运算结果。MySQL运算符优先级如表6-1所示,当一个表达式中的两个运算符有相同的优先级时,根据它们在表达式中的位置,一般而言,一元运算符按从右到左(即右结合性)的顺序运算,二元运算符按从左到右(即左结合性)的顺序运算。
MySQL的存储过程
1、存储过程是一组为了完成特定功能的SQL语句块,经编译后存储在数据库中,用户通过指定存储过程的名称并给定参数(如果该存储过程带有参数)来调用并执行它,存储过程能重复使用,这样可以大大减少数据库开发人员的工作量。
存储过程主要有以下优点。
(1)执行效率高:存储过程编译后存储在数据库服务器端,可以直接调用从而提高了SQL语句的执行效率。
(2)灵活:存储过程可以用结构化语句编写,可以完成较复杂的判断和运算。(3)数据独立:用户在程序中调用存储过程,存储过程能把数据同用户程序隔离开,其优点是当数据表结构变化时,可以随时修改存储过程,不用修改程序源代码。
(4)安全:存储过程可被作为一种安全机制来充分利用,系统管理员通过设置存储过程的访问权限,从而实现相应数据的访问权限限制,避免了用户对数据表的直接访问,保证了数据的安全。
(5)降低网络流量:当在客户机上调用该存储过程时,网络中传送的只是该调用语句,而不是这一功能的全部代码,从而大大降低了网络负载。2、DELIMITER命令。DELIMITER命令用于更改MySQL语句的结束符,如将默认结束符“;”更改为“$$”,避免与SQL语句默认结束符相冲突,其语法格式为:
DELIMITER<自定义结束符>
创建与使用事务
开始事务:
Start transaction;
提交事务:
Commit;
取消事务:
Rollbock;
设置事务级别
设置事务隔离级别:
set session transaction isolation level 隔离级别;
事务隔离级别:
read uncommitted读未提交(脏读)
Read commited读提交(不可重复读)
Repeatable read可重复读(幻读)
serializable可串行化