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

mysql存储过程的小问题,无法运行

发布时间:2025-05-12 02:48:56    发布人:远客网络

mysql存储过程的小问题,无法运行

一、mysql存储过程的小问题,无法运行

CREATE PROCEDURE p7(IN b INTEGER(12))

SELECT s1*a FROM t WHERE b<=s1;

这一段可以执行的--~~~难道没有BEGIN没有END么--,这段代码你用不了?

哦......你难道是在命令行里面创建存储过程!!!?

那这样不行,我从来没在命令行里面试过,有很多软件可以用啊,而且没软件也可以写SQL脚本,然后直接执行啊,在命令行里面创建不是很方便。

CREATE PROCEDURE p7(IN b INTEGER(12))

SELECT s1*a FROM t WHERE b<=s1;

不过推荐使用EMS FOR MYSQL,DREAMCODE FOR MYSQL,PHPMYADMIN或者使用官方的MYSQL图形化工具

你的问题1在于没有传参数,就上上面这段代码,要是把参数去掉还是会报错,MYSQL好像不允许执行不传参数的存储过程,但是你也可以随便声明一个,因为你可以把b定义在存储过程内,参数不使用就是了,比如:

CREATE PROCEDURE p7(IN X INTEGER(12))

SELECT s1*a FROM t WHERE b<=s1;

然后call p7(12);但是参数X并不影响你的存储过程,但是必须传一个。

问题2,你没有声明a,b,变量必须声明--

问题3,我是从5.0开始用MYSQL的,所以我不太清楚以前MYSQL变量的表现形式,但是在存储过程内,declare a char(4);声明一个变量a,我要用它的时候,set a='abcd';就行了,不用带@

我把insert into t values(a)改为@a,那就插入的是空值

最后end后面没有分号,最后一个END后面没分号,中间的有分号的比如

CREATE PROCEDURE p7(IN X INTEGER(12))

SELECT s1*a FROM t WHERE b<=s1;

SELECT s1*a FROM t WHERE a<=s1;

二、MySQL里面sql语句调用存储过程,该如何写

1、CREATEPROCEDUREsp_add(a int, b int,outc int)

2、存储过程(stored procedure)是一组为了完成特定功能的SQL语句集合,经编译后存储在服务器端的数据库中,利用存储过程可以加速SQL语句的执行。

3、存储过程分为系统存储过程和自定义存储过程。

4、系统存储过程在master数据库中,但是在其他的数据库中可以直接调用,并且在调用时不必在存储过程前加上数据库名,因为在创建一个新数据库时,系统存储过程在新的数据库中会自动创建。

5、自定义存储过程,由用户创建并能完成某一特定功能的存储过程,存储过程既可以有参数又有返回值,但是它与函数不同,存储过程的返回值只是指明执行是否成功,并不能像函数那样被直接调用,只能利用execute来执行存储过程。

三、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