首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > Mysql >

MySQL学习札记——存储程序(二)

2012-09-29 
MySQL学习笔记——存储程序(二)五、存储过程的参数类型????????? 存储过程的参数分为3种类型。对于IN参数,调用

MySQL学习笔记——存储程序(二)

五、存储过程的参数类型

????????? 存储过程的参数分为3种类型。对于IN参数,调用者把一个值传递给过程,过程可以对这个值进行修改,但任何修改在过程返回后对调用者都是不可见的。OUT参数刚好相反,过程把一个值赋值给OUT参数,这个值在过程返回后可以由调用者访问。INOUT参数允许调用者向过程传递一个值,然后再取回一个值。如果没有为参数指定类型,其默认类型将是IN。

??????? 在使用OUT或INOUT参数时,在调用过程时需要给出一个变量名。过程可以设置参数的值,相应的变量将在过程返回时获得那个值。如果想让某个存储过程返回多个结果值,OUT和INOUT参数类型将非常有用。

例子:分别统计出student数据表里的男生和女生人数并通过它的参数返回这两个计数值,让调用者可以访问他们:


MySQL学习札记——存储程序(二)
?注: IN、OUT和INOUT关键字不适用于任何存储函数、触发器或事件。对于存储函数,所有的参数都像IN参数。触发器和事件则根本没有任何参数。

?

六、触发器

?????? 触发器是与特定数据表相关联的存储过程,当相应的数据表被INSERT、DELETE或UPDATE语句修改时,触发器将自动执行。触发器可以被设置成在这几种语句处理每个数据行之前或之后触发。触发器的定义包括一条将在触发器被触发时执行的语句。

???????? 触发器的好处:

??????? ①触发器可以检查或修改将被插入或用来更新数据行的新数据值。这意味着我们可以利用触发器强制实现数据的完整性。

???????? ②触发器还可以把表达式的结果赋值给数据列作为其默认值。这使我们可以绕开数据列定义里的默认值必须是常数的限制。

????????? ③触发器可以在删除或修改数据行之前先检查它的当前内容。

??? 触发器创建语句的基本语法如下所示:

CREATETRIGGER trigger_name

? { BEFORE | AFTER }

? { INSERT | UPDATE | DELETE }

ONtb1_name

FOR EACHROW trigger_stmt;

下面是一个示例:


MySQL学习札记——存储程序(二)

七、事件

??????? MySQL5.1.6及更高版本有一个事件调用器,它使我们可以把数据库操作安排在预订时间执行。事件是一个与时间表相关联的存储程序,时间表用来定义事件发生的时间、次数以及何时消失。事件非常适合用来执行各种无人值守的系统管理任务,如定期更新汇总报告、清理过期失效的数据、对日志数据表进行轮转等。

??????? 在默认情况下,事件调度器不会运行。要想使用事件,必须先启用事件调度器。把以下语句添加到选项文件中(服务器在启动时将读取)

[mysqld]

event_scheduler=ON

查看时间调度器的状态:

? SHOW VARIABLES LIKE 'event_scheduler';



MySQL学习札记——存储程序(二)
?
?想在系统运行时停止或启动事件调度器,可以通过改变event_scheduler系统变量的值(它是一个GLOBAL变量,你必须有SUPER权限才能修改它)。

SETGLOBAL event_scheduler = OFF;????????????# or 0

SETGLOBAL event_scheduler = ON;?????????????# or 1

注:如果在启动服务器时把event_scheduler变量设置为DISABLED,在系统运行时,你将只能查看它的状态,不能改变它的状态。在此基础上,你仍可以创建事件,但它们不能执行。

下面事件是每隔4小时执行一次,把超过一天的数据行清除掉:

CREATEEVENT expire_web_session

??? ON SCHEDULER EVERY 4 HOUR

??? DO

???????? DELETE FROM web_session

???????? WHERE last_visit <CURRENT_TIMESTAMP - INTERVAL 1 DAY;

EVERY n interval子句用来给出事件定期执行的时间间隔。interval值近似于DATE_ADD()函数里的参数值,可以是HOUR、DAY或MONTH。在EVERY子句的后面,还可以用STARTS datetime和ENDS datetime选项给出事件第一次和最后一次执行的时间。默认情况下,EVERY事件将在它被创建后立刻开始它的第一次执行,并将一直执行下去。

?

如果想创建一个只执行一次的事件,应使用AT调度类型而不是EVERY。如下所示的定义将创建一个只执行一次的事件,在一个小时后执行:

?? CREATE EVENT one_shot

?????? ON SCHEDULER AT CURRENT_TIMESTAMP +INTERVAL 1 HOUR

?????? DO?…… ;

禁用某个事件:

? ALTER EVENT event_name DISABLE;

激活已禁用的事件

?ALTER EVENT event_name ENABLE;

?

每个事件都隶属于某个数据库,所以必须拥有那个数据库的EVENT权限才能为它创建或删除事件。

?

热点排行