单语句存储过程非常有用,但存储过程的真正功能在于它能够封装和执行多个语句。因为这两个应用程序都需要能够计算奖金数额,所以这个任务非常适合使用存储函数实现。本节余下部分主要介绍创建多语句存储过程时常用的语法。......
2023-10-29
如下语法可用于创建存储过程:
而如下语法用于创建存储函数:
例如,来创建一个返回静态字符串的简单存储过程:
仅此而已。现在使用如下命令执行此存储过程:
执行此过程将返回如下输出:
当然,这是所能提供的最简单的示例了。请继续阅读,了解创建复杂(也更有用)的存储过程还有哪些选项。
1.设置安全权限
DEFINER子句确定将查看哪个用户账户来确定是否有适当的权限执行存储过程定义的查询。如果使用DEFINER子句,需要采用'user'@'host'语法指定用户名和主机名(例如,'jason'@'localhost')。如果使用CURRENT USER(默认值),就会查看导致执行这个存储过程的用户账户权限。只有拥有SUPER权限的用户才能为另一个用户指定DEFINER。
2.设置并返回输入参数
存储过程可以接受输入参数,并把参数返回给调用方。不过,对于每个参数,需要声明其参数名、数据类型,还要指定此参数是用于向过程传递信息、从过程传回信息,还是二者皆有。注解本节只适用于存储过程。虽然存储函数也可以接受参数,但只支持输入参数,而且必须返回一个且仅一个值。因此,当在存储函数中声明输入参数时,要确定只包括参数名和类型。 也许并不奇怪,这些数据类型对应于MySQL支持的数据类型。因此,可以把参数的数据类型声明
为创建表时可用的任何数据类型。为声明参数的作用,使用如下3个关键字之一。
➢ IN:只用来向过程传递信息。
➢ OUT:只用来从过程传回信息。
➢ INOUT:可以向过程传递信息,如果值改变,则可再从过程外调用。
对于任何声明为OUT或INOUT的参数,当调用存储过程时需要在参数名前加上@符号,这样该参数就可以在过程外调用了。考虑一个名为get_inventory的过程,它接受两个参数,productid是一个确定感兴趣商品的IN参数,count是向调用者返回值的OUT参数:
此过程可以如下调用:(www.chuimin.cn)
count参数可以像这样访问:
3.特点
利用一些称为特点(characteristic)的属性,可以进一步调整存储过程的功能。下面给出完整的特点列表,后面分别进行介绍:
➢ LANGUAGE SQL
当前,SQL是唯一支持的存储过程语言,但有计划在将来引入支持其他语言的框架。此框架将公开化,意味着任何有兴趣并且有能力的程序员都可以自由地增加对所喜爱语言的支持。例如,能够使用PHP、Perl和Python语言创建存储过程,这意味着过程的功能只受所使用语言的限制。
➢ [NOT] DETERMINISTIC
只用于存储函数,只要传入相同的参数集,任何声明为DETERMINISTIC的函数每次都会返回相同的值。将函数声明为DETERMINISTIC将有助于MySQL优化存储函数的执行。
➢ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA
此设置指示存储过程将完成何种类型的任务。默认值CONTAINS SQL指示会出现SQL但不会读写数据。NO SQL指示过程中不出现SQL。READS SQL DATA指示SQL只能获取数据。最后,MODIFIES SQL DATA指示SQL将修改数据。在编写本书时,此特点对存储过程的功能没有影响。
➢ SQL SECURITY {DEFINER | INVOKER}
如果SQL SECURITY特点设为DEFINER,则此过程将根据定义此过程的用户的权限执行。如果设置为INVOKER,则根据执行此过程的用户的权限执行。
可能认为DEFINER设置有些奇怪,它可能不安全。毕竟,为什么会有人允许用户使用其他用户的权限执行过程呢?这实际上是增强而不是削弱系统安全性的一个很好的方法,因为它允许创建除了能执行过程再没有任何其他权限的用户。
➢ COHMENT 'string'
使用COMMENT特点,可以增加关于此过程的一些描述性信息。
有关MySQL数据库设计与实现的文章
单语句存储过程非常有用,但存储过程的真正功能在于它能够封装和执行多个语句。因为这两个应用程序都需要能够计算奖金数额,所以这个任务非常适合使用存储函数实现。本节余下部分主要介绍创建多语句存储过程时常用的语法。......
2023-10-29
在MySQL已经成功启动的前提下,输入以下命令:这样一个名为shop的数据库就创建成功了。图4.1查看系统内数据库在图4.1中,第一个数据库information_schema是MySQL自带的,该数据库存储了所有MySQL服务器管理的数据库信息,比如数据库名、数据库的表、表的数据类型及访问权限等。图4.2非法的数据库名如果要创建的数据库名字在MySQL中已经存在,也会发生错误。......
2023-10-29
存储过程是SQL查询语句与控制流语句的预编译集合,并以特定的名称保存在数据库中。存储过程也是数据库对象。可以在存储过程中声明变量、编写SQL语句、使用条件控制语句来实现存储过程的功能。然后,存储过程可以在数据库服务器的安全范围内进行维护,根本不触及应用程序代码。本章将介绍MySQL如何实现存储过程,不仅讨论其语法,还会展示如何创建、管理和执行存储过程。还将学习如何将存储过程集成到Web应用程序中。......
2023-10-29
表示索引为唯一性索引。指索引的长度,必须是字符串类型才可以使用。如果在创建索引时没写索引名称,MySQL会自动用字段名作为索引名称。其中table_name是要增加索引的表名,column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。另外,ALTER TABLE允许在单个语句中更改多个表,因此可以在同时创建多个索引。另外,不能用CREATE INDEX语句创建PRIMARY KEY索引。......
2023-10-29
创建视图是通过CREATE VIEW语句实现的。当视图指定为TEMPTABLE时,将在创建视图的同时创建相应的TEMPORARY表。如果为视图指定了UNDEFINED算法,当查询指示其结果和视图结果是一对一关系时,MySQL将选择TEMPTABLE。DEFINER子句确定在视图执行时将检查哪个用户账户的权限来确定是否有适当的权限执行这个视图。......
2023-10-29
当创建表时,必须指定表名、列名及数据类型。图4.5创建表stuinfo创建完表以后可使用show tables命令来查看当前数据库中可用的表。图4.7创建表item在图4.7中创建了一个名为item的表。在字段other中,null表示允许该列为空,若没有特别指定该列为null或not null,默认情况下该列允许为空。图4.8查看表item的表结构要查看注释标识可通过show create table命令。......
2023-10-29
如果出现提示使用MySQL 5.1.6之前的版本,则需要SUPER权限才能创建触发器;而从5.1.6开始,账户有TRIGGER权限就可以创建触发器。关于这个前缀及类似前缀的更多信息,请参见补充内容“触发器命名约定”。触发器命名虽然没有要求,但为触发器采用某种命名约定是一个好主意,这样可以更快地确定每个触发器的作用。例如,可以考虑为每个触发器加上如下字符串作为前缀,触发器创建示例中就采用了这种做法。au,在UPDATE查询发生之后执行触发器。......
2023-10-29
另外还有其他一些特别用途的表,但重点是: MySQL支持很多类型的表,每种类型都有自己特定的作用、优点和缺点。MySQL还相应地提供了很多不同的存储引擎,可以以最适合于应用需求的方式存储数据。本节介绍MySQL的十种可用的存储引擎,指出每种引擎的作用、优点和缺点。介绍了存储引擎之后,接下来是关于FAQ的一节,讨论关于存储引擎的其他问题。......
2023-10-29
相关推荐