您当前的位置:首页 > 互联网教程

mysql 存储过程怎么调用

发布时间:2025-05-19 06:08:04    发布人:远客网络

mysql 存储过程怎么调用

一、mysql 存储过程怎么调用

PHP调用MySQL存储过程和函数的方法较为复杂,尤其是在没有直接支持的情况下。MySQL5.0引入了存储过程和函数,PHP可以通过一些间接方法来调用它们。

调用存储过程需要遵循特定步骤。首先,如果存储过程包含IN或INOUT参数,需要声明一个变量,并将PHP变量映射到MySQL变量。这一步骤可通过执行如下的语句实现:set@mysqlvar=$phpvar。然后,使用mysql_query()或mysql_db_query()函数执行这条语句,确保MySQL服务器能识别这个变量。

接下来,根据存储过程的需要执行相应的调用语句。对于存储过程,可以使用call procedure()语句,即mysql_query("call procedure([var1]...)")。如果有返回值,则需要执行select@ar以获取结果。通过mysql_query("select@var)")执行此操作。

如果调用的是函数,则可以直接通过select function()来执行,无需额外的调用步骤。在上述示例中,使用了本地连接来执行存储过程调用,包括设置变量、调用存储过程以及查询结果。

在PHP脚本中,通过mysql_connect()函数建立数据库连接,随后使用mysql_select_db()选择数据库。之后,通过一系列的mysql_query()调用执行存储过程和函数的调用语句,最终通过mysql_fetch_row()获取并显示查询结果。

这里展示了一个具体的例子:首先连接到数据库,设置一个变量,然后调用一个存储过程,并执行select语句以获取返回值。最后,通过echo输出结果。

二、SQL 中存储过程怎么使用

drop procedure if exists GetUsers;

1、MySql支持 IN(传递给存储过程), OUT(从存储过程传出)和 INOUT(对存储过程传入和传出)类型的参数,存储过程的代码位于 BEGIN和 END语句内,它们是一系列 SQL语句,用来检索值,然后保存到相应的变量(通过指定INTO关键字);

2、下面的存储过程接受三个参数,分别用于获取用户表的最小,平均,最大分数,每个参数必须具有指定的类型,这里使用十进制值(decimal(8,2)),关键字 OUT指出相应的参数用来从存储过程传出

select min(score) into minScore from user;

select avg(score) into avgScore from user;

select max(score) into maxScore from user;

3、调用此存储过程,必须指定3个变量名(所有 MySql变量都必须以@开始),如下所示:

call GetScores(@minScore,@avgScore,@maxScore);12

4、该调用并没有任何输出,只是把调用的结果赋给了调用时传入的变量@minScore,@avgScore,@maxScore,然后即可调用显示该变量的值:

select@minScore,@avgScore,@maxScore;

5、使用 IN参数,输入一个用户 id,返回该用户的名字:

call GetNameByID(1,@userName);

三、mysql怎么让一个存储过程定时执行

mysql怎么让一个存储过程定时执行

查看event是否开启: show variables like'%sche%';

将事件计划开启: set global event_scheduler=1;

关闭事件任务: alter event e_test ON COMPLETION PRESERVE DISABLE;

开户事件任务: alter event e_test ON COMPLETION PRESERVE ENABLE;

创建表 CREATE TABLE test(endtime DATETIME);

update examinfo SET endtime= now() WHERE id= 14;

CREATE EVENT if not exists e_test

每隔30秒将执行存储过程test,将当前时间更新到examinfo表中id=14的记录的endtime字段中去

1)首先来看一个简单的例子来演示每秒插入一条记录到数据表

CREATE TABLE aaa(timeline TIMESTAMP);

DO INSERT INTO test.aaa VALUES(CURRENT_TIMESTAMP);

ON SCHEDULE AT CURRENT_TIMESTAMP+ INTERVAL 5 DAY

3) 2007年7月20日12点整清空test表:

ON SCHEDULE AT TIMESTAMP'2007-07-20 12:00:00'

5) 5天后开启每天定时清空test表:

STARTS CURRENT_TIMESTAMP+ INTERVAL 5 DAY

6)每天定时清空test表,5天后停止执行:

ENDS CURRENT_TIMESTAMP+ INTERVAL 5 DAY

7) 5天后开启每天定时清空test表,一个月后停止执行:

STARTS CURRENT_TIMESTAMP+ INTERVAL 5 DAY

ENDS CURRENT_TIMESTAMP+ INTERVAL 1 MONTH

[ON COMPLETION [NOT] PRESERVE]可以设置这个事件是执行一次还是持久执行,默认为NOT PRESERVE。

8)每天定时清空test表(只执行一次,任务完成后就终止该事件):

[ENABLE| DISABLE]可是设置该事件创建后状态是否开启或关闭,默认为ENABLE。

[COMMENT‘comment’]可以给该事件加上注释。

[ON COMPLETION [NOT] PRESERVE]

3)将每天清空test表改为5天清空一次:

DROP EVENT [IF EXISTS] event_name

当然前提是这个事件存在,否则会产生ERROR 1513(HY000): Unknown event错误,因此最好加上IF EXISTS

ON SCHEDULE AT'2007-09-01 12:00:00'+ INTERVAL 1 DAY

do insert into yyy values('hhh','uuu');

解释:从2007-09-01开始,每天对表yyy在12:00:00进行一个插入操作。而且只执行一次(on completion not preserve)

ON SCHEDULE AT'2010-05-22 23:00:00'+ INTERVAL 1 DAY

do truncate table bjproj.ae_tmp;

三、通过设定全局变量event_scheduler的值即可动态的控制事件调度器是否启用。

查看是否event_scheduler开启mysql> SHOW VARIABLES LIKE'%event%';

设置开启mysql> SET GLOBAL event_scheduler=ON;

分钟插入一条日志:DELIMITER//CREATE EVENT `user_log_event` ON SCHEDULE EVERY 1

MINUTE STARTS'2010-12-27 00:00:00' ON COMPLETION NOT PRESERVE ENABLE DO

BEGIN INSERT INTO log SET addtime=NOW();END//

//CREATE EVENT `user_log_event` ON SCHEDULE EVERY 1 DAY STARTS

'2010-00-00 00:00:00' ON COMPLETION NOT PRESERVE ENABLE DO BEGIN