【问题标题】:I dont't understand why im getting syntax error on my code below. Can anyone help me?我不明白为什么我在下面的代码中出现语法错误。谁能帮我?
【发布时间】:2017-07-21 03:03:33
【问题描述】:
 DELIMITER ##
 create trigger tra_Price after update on assets_cdn_charge for each row
 begin
 declare res int;
 declare ids int;
 declare idq int;
 declare idt int;
 set res = (select price from assets_cdn_charge where price = new.price);
 set ids = (select id from assets_cdn_charge where price = new.price);
 DECLARE cur CURSOR FOR SELECT id FROM assets_cdn_composite WHERE cdn_charge_id = ids;
 open cur;
 ins_loop:LOOP
 fetch cur into idq;
 declare curs cursor for select id from assets_cdn_traffic where domain_name_id = idq;
 open curs;
 ins1_loop:LOOP
 fetch curs into idt;
 update assets_cdn_traffic set cost = traffic * res where domain_namd_id = idt;
 end LOOP;
 close curs;
 end LOOP;
 close cur;
 END; ##

当我运行这段代码时,我得到了这个错误:

ERROR 1064 (42000):您的 SQL 语法有错误;检查 与您的 MySQL 服务器版本相对应的手册 在 'DECLARE cur CURSOR FOR SELECT id FROM 附近使用的语法 assets_cdn_composite WHERE cdn_charge_id =' 第 9 行

【问题讨论】:

    标签: mysql cursor declare


    【解决方案1】:

    可能是因为:

    DECLARE 只允许在 BEGIN ... END 复合语句中 并且必须位于开头,在任何其他语句之前

    ...所以该行可能会移到该点上方的两个 set 语句之前。

    我相信,如果修复了该错误,您将会遇到其他麻烦,因为我不知道您希望该查询检索什么,因为 idq 在该点之前声明,但未设置为任何值?

    =====

    更新:

    以下是先前评论中关于完全消除游标的可能性的示例。试试这个:

    BEGIN
        UPDATE assets_cdn_traffic
            JOIN assets_cdn_composite ON assets_cdn_traffic.domain_name_id = assets_cdn_composite.cdn_charge_id
            JOIN assets_cdn_charge ON assets_cdn_charge.id = assets_cdn_composite.cdn_charge_id
        SET cost = traffic * NEW.price
        WHERE assets_cdn_charge.id = NEW.id
    END
    

    但是,我会在触发器中使用之前单独尝试更新查询,以确保它按预期工作。将NEW.priceNEW.id 替换为测试值以验证处理。

    【讨论】:

    • 谢谢你的回答,我弄错了,idq必须是ids at "declare curs cursor for select id from assets_cdn_traffic where domain_name_id = idq;"
    • 好的,但是您仍然会遇到该行的问题。根据文档,所有DECLARE 语句必须出现在开头。另外,这里还有一个错字:domain_namd_id
    • 谢谢你的帮助,我明白了,也许我可以使用左连接。
    • 左加入什么? ...无论如何,我认为您可以简化查询,至少减少一个,和/或甚至可能完全避免对游标的需要,但这需要一些努力。
    • 因为我有三个表并且它们是关系,所以我必须使用左连接。像这样:DECLARE cur CURSOR FOR SELECT assets_cdn_traffic.id FROM assets_cdn_traffic left join assets_cdn_composite on assets_cdn_traffic.domain_namd_id= assets_cdn_composite.id left join(select * from assets_cdn_charge where price = new.price) on assets_cdn_composite.cdn_charge_id=assets_cdn_charge.id;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 2022-12-18
    相关资源
    最近更新 更多