【问题标题】:Unable to fix the stored procedure error无法修复存储过程错误
【发布时间】:2026-01-27 01:10:01
【问题描述】:

您能帮我找出存储过程中的错误吗?谢谢!!!

创建过程 realiza_tracking_primer_lectura ( 在 v_campaign_id int(11) 中, 在 v_ares_emails_id int(11) 中, 在 v_userid int(11) 中, 在 v_country varchar(2) 中, 在 v_ip varchar(15) 中, 在 v_useragent varchar(255) 中, 在 v_time int(11)) 开始 DECLARE ReadBefore int DEFAULT null; 如果 v_campaign_id 为 Null 则 SELECT userid FROM tracking_lecturas WHERE ares_emails_id = v_ares_emails_id and userid = v_userid into ReadBefore; 别的 SELECT userid FROM tracking_lecturas WHERE campaign_id = v_campaign_id and userid = v_userid into ReadBefore; 万一; 如果 ReadBefore 为 Null 则 插入 tracking_lecturas (campaign_id, ares_emails_id, userid, ip, useragent, timestamp) 值 (v_campaign_id, v_ares_emails_id, v_userid, v_ip, v_useragent, v_time); 万一; 结尾 分隔符;

【问题讨论】:

  • 请分享您遇到的错误 - 无法编译?编译但运行时错误?运行但结果不正确?
  • 运行或编译出错?

标签: mysql stored-procedures


【解决方案1】:

试试这个:

-- Dumping structure for procedure test.realiza_tracking_primer_lectura
DROP PROCEDURE IF EXISTS `realiza_tracking_primer_lectura`;
DELIMITER //
CREATE PROCEDURE `realiza_tracking_primer_lectura`(IN `v_campaign_id` int(11),IN `v_ares_emails_id` int(11),IN `v_userid` int(11),IN `v_country` varchar(2),IN `v_ip` varchar(15),IN `v_useragent` varchar(255),IN `v_time` int(11))
BEGIN
    #Routine body goes here...
        DECLARE ReadBefore int DEFAULT null;
        if v_campaign_id is Null then
            SELECT userid FROM tracking_lecturas WHERE ares_emails_id = v_ares_emails_id and userid = v_userid into ReadBefore;
         Else
            SELECT userid FROM tracking_lecturas WHERE campaign_id = v_campaign_id and userid = v_userid into ReadBefore;
         end if;

         if ReadBefore is Null then
            insert into tracking_lecturas (campaign_id, ares_emails_id, userid, ip, useragent, timestamp) values (v_campaign_id, v_ares_emails_id, v_userid, v_ip, v_useragent, v_time);
        end if;

END//
DELIMITER ;

【讨论】:

    【解决方案2】:

    CREATE PROCEDURE 之前缺少分隔符定义DELIMITER //。还需要通过在END 前面添加// 来终止程序,如下所示:

    DELIMITER // -- define your delimiter here
    CREATE PROCEDURE 
            realiza_tracking_primer_lectura (
            in v_campaign_id int(11), 
            in v_ares_emails_id int(11), 
            in v_userid int(11), 
            in v_country varchar(2),
            in v_ip varchar(15),
            in v_useragent varchar(255),
            in v_time int(11)) 
            BEGIN
                DECLARE ReadBefore int DEFAULT null;
                if v_campaign_id is Null then
                    SELECT userid FROM tracking_lecturas WHERE ares_emails_id = 
                    v_ares_emails_id and userid = v_userid into ReadBefore;
                Else
                    SELECT userid FROM tracking_lecturas WHERE campaign_id = v_campaign_id and userid = v_userid into ReadBefore;
                end if;
    
                if ReadBefore is Null then
                insert into tracking_lecturas (campaign_id, ares_emails_id, userid, ip, useragent, timestamp) values (v_campaign_id, v_ares_emails_id, v_userid, v_ip, v_useragent, v_time);
                end if;
    
            END // -- terminate the procedure
    DELIMITER ; -- revert to default delimiter
    

    【讨论】: