首页 理论教育MySQL数据库存储过程创建

MySQL数据库存储过程创建

【摘要】:如下语法可用于创建存储过程:而如下语法用于创建存储函数:例如,来创建一个返回静态字符串的简单存储过程:仅此而已。请继续阅读,了解创建复杂的存储过程还有哪些选项。例如,能够使用PHP、Perl和Python语言创建存储过程,这意味着过程的功能只受所使用语言的限制。在编写本书时,此特点对存储过程的功能没有影响。

如下语法可用于创建存储过程:

而如下语法用于创建存储函数:

例如,来创建一个返回静态字符串的简单存储过程:

仅此而已。现在使用如下命令执行此存储过程:

执行此过程将返回如下输出:

当然,这是所能提供的最简单的示例了。请继续阅读,了解创建复杂(也更有用)的存储过程还有哪些选项。

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特点,可以增加关于此过程的一些描述性信息。