mysql - 仅执行今天尚未运行的 MySQL 存储过程

标签 mysql sql

这主要是对已经工作的存储过程的一种保险类型的补充,我似乎无法让代码工作。

我声明了 dt 并有一个 if 语句来检查 dt = date(now()) 但我正在做某事错误,因为这会引发错误。我也愿意采用更有效/更智能的方法来检查这一点。这就是我想出来的。

--/
CREATE PROCEDURE Matt.find_newwinners()
begin
    declare done int default false;
    declare a varchar(10);

    declare dt varchar(30);
    set dt = (select date(max(dateadded)) from dbo.newwins);

    declare cur1 cursor for select personoid from dbo.view_newwinners;
    declare continue handler for not found set done = true;

    open cur1;

    read_loop: loop
        fetch cur1 into a;

        if done then leave read_loop;
        end if;

        if dt = date(now()) then leave read_loop;
        /* would also be nice to print a reason why we are exiting */
        end if;

        insert ignore into dbo.newwins (personoid, dateadded) values (a, now());

    end loop;
    close cur1;
end

/

错误消息:

[Code: 1064, SQL State: 42000]  You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'declare cur1 cursor for select personoid from dbo.view_newwinners;
declare conti' at line 7
Code: 1064 SQL State: 42000 --- You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'declare cur1 cursor for select personoid from dbo.view_newwinners;
declare conti' at line 7

最佳答案

您收到的错误与 IF 语句无关,而是因为必须在 BEGIN 语句之后立即声明游标。参见 syntax error on DECLARE CURSOR FOR .

但是,您的过程可以简化,因此您根本不需要光标。只需使用 INSERT ... SELECT 将查询结果插入表中,并将 IF 放在查询周围。

--/
CREATE PROCEDURE Matt.find_newwinners()
begin

    declare dt DATE;
    set dt = (select date(max(dateadded)) from dbo.newwins);
    IF dt != TODAY() THEN 
        INSERT INTO dbo.newwins (personoid, dateadded)
        SELECT personoid, NOW()
        FROM dbo.view_newwinners;
    END IF

end

/

您甚至可以完全摆脱 IF:

INSERT INTO dbo.newwins (personoid, dateadded)
SELECT personoid, NOW()
FROM dbo.view_newwinners
CROSS JOIN (
    SELECT DATE(MAX(dateadded)) AS lastadded
    FROM dbo.newwins) AS x
WHERE lastadded != TODAY();

关于mysql - 仅执行今天尚未运行的 MySQL 存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44768995/

相关文章:

mysql - 改变 '/var/lib/mysql/' : Permission denied 的所有权

PHP - 无法使用 PDO 插入表

连接行上的mysql GROUP_CONCAT DISTINCT

mysql - PHP/MySQL - 单击链接更改查询

sql - 用 datepart(day) 求和一个不同的计数

MySQL 改变返回值

MySQL - 如何对两个字段进行分组并计数

MySQL 查询返回错误 ID

mysql - 寻找包含所有美国邮政编码、州和城市的最新 SQL 数据库

mysql - 我们如何设置 MariaDB 每天创建一个新的 requests.log 文件?