【问题标题】:can't populate table because of vague syntax error由于模糊的语法错误,无法填充表格
【发布时间】:2020-09-19 05:04:11
【问题描述】:

我正在尝试从 phpmyadmin 上的数据库中填充一个表,所以我有这个脚本:

USE avi; //database


SET @listOfStates = 'AK, AL, AR, AS, AZ, CA, CO, CT, DC, DE, FL, GA, GU, HI, IA, ID, IL, IN, KS, KY, LA, MA, MD, ME, MI, MN, MO, MP, MS, MT, NC, ND, NE, NH, NJ, NM, NV, NY, OH, OK, OR, PA, PR, RI, SC, SD, TN, TX, UM, UT, VA, VI, VT, WA, WI, WV, WY';

SET @item = SUBSTRING_INDEX(@listOfStates, ',', 1); 
SET @itemValue = 0;

CREATE PROCEDURE populate()
BEGIN
SET @strLen = LENGTH(@listOfStates); 

label1: LOOP

    SET @strLen = LENGTH(@listOfStates);
    SET @item = SUBSTRING_INDEX(@listOfStates, ',', 1); 
    SELECT COUNT(*) INTO @itemValue FROM us_accidents u WHERE u.state LIKE item;

    INSERT INTO state_cases (name, cases) VALUES (@item, @itemValue);

    SET @SubStrLen = LENGHT(SUBSTRING_INDEX(listOfStates, ',', 1));
    SET @listOfStates =  MID(listOfStates, SubStrLen, strLen);

    IF listOfStates = NULL
        LEAVE label1;
    ITERATE label1;

    END LOOP label1;


END; 

当我尝试导入时,我得到了这个

我使用 SET @ 错了吗?还是我的程序甚至 varchar 有问题?

我提到表已经创建。

【问题讨论】:

    标签: mysql sql stored-procedures phpmyadmin


    【解决方案1】:

    您的主要问题是您在存储过程开始之前缺少DELIMITER 命令。

    此外,过程末尾的IF 语句格式不正确:语法为IF ... THEN ... END IF;。最后,要检查空值,您需要 IS NULL 而不是 = NULL

    这样编译成功:

    SET @listOfStates = 'AK, AL, AR, AS, AZ, CA, CO, CT, DC, DE, FL, GA, GU, HI, IA, ID, IL, IN, KS, KY, LA, MA, MD, ME, MI, MN, MO, MP, MS, MT, NC, ND, NE, NH, NJ, NM, NV, NY, OH, OK, OR, PA, PR, RI, SC, SD, TN, TX, UM, UT, VA, VI, VT, WA, WI, WV, WY';
    
    SET @item = SUBSTRING_INDEX(@listOfStates, ',', 1); 
    SET @itemValue = 0;
    
    DELIMITER //
    
    CREATE PROCEDURE populate()
    BEGIN
        SET @strLen = LENGTH(@listOfStates); 
    
        label1: LOOP
    
            SET @strLen = LENGTH(@listOfStates);
            SET @item = SUBSTRING_INDEX(@listOfStates, ',', 1); 
            SELECT COUNT(*) INTO @itemValue FROM us_accidents u WHERE u.state LIKE item;
    
            INSERT INTO state_cases (name, cases) VALUES (@item, @itemValue);
    
            SET @SubStrLen = LENGHT(SUBSTRING_INDEX(listOfStates, ',', 1));
            SET @listOfStates =  MID(listOfStates, SubStrLen, strLen);
    
            IF listOfStates IS NULL THEN
                LEAVE label1;
            END IF;
    
            ITERATE label1;
    
        END LOOP label1;
    
    END; 
    //
    
    DELIMITER ; 
    

    【讨论】:

    • LENGHT 是 LENGTH 的同义词还是其他 MySQL 特定的同义词?
    • @TomC:我认为这是一个错字。
    • 这就是我所希望的,但它看起来像剪切和粘贴。
    猜你喜欢
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 2018-03-18
    • 2020-04-24
    • 1970-01-01
    • 2018-08-04
    相关资源
    最近更新 更多