【问题标题】:MySQL: Unknown column in 'field list'MySQL:“字段列表”中的未知列
【发布时间】:2014-12-23 04:54:17
【问题描述】:

我是 MySQL 存储过程的新手。为什么我的存储过程开始...

DROP PROCEDURE IF EXISTS videodb.addVideo;
CREATE PROCEDURE videodb.addVideo(vidTitle VARCHAR(255), vidDescription VARCHAR(500), producerArray VARCHAR(500), actorArray VARCHAR(500), OUT vidSuccess BOOL)
    START TRANSACTION;
            SET @videoInsertVar = 'INSERT INTO videodb.videos (id, title, description) VALUES(?, ?, ?)';
            SET @videoId = NULL;
            SET @videoTitle = vidTitle; -- this is line 69

...产生这个奇怪的错误...

ERROR 1054 (42S22) at line 69: Unknown column 'vidTitle' in 'field list'

【问题讨论】:

  • 包裹在BEGIN-END 这将使body成为一个单一的语句。见dev.mysql.com/doc/refman/5.7/en/create-procedure.html
  • 没错。我最初有一个BEGIN ... END,但我误解了文档。我认为这意味着您应该使用 START TRANSACTION 代替 BEGIN ... END,但现在我明白了:“在所有存储程序(存储过程和函数、触发器和事件)中,解析器将 BEGIN [WORK] 视为BEGIN ... END 块。要在此上下文中开始事务,请改用 START TRANSACTION。"
  • @PM77-1 如果您将评论变成答案,我会接受。感谢您的帮助!

标签: mysql stored-procedures


【解决方案1】:

您的问题是,引发错误的语句实际上是在您的过程之外,因此,在其参数范围之外。解决方案是将整个routine_body过程包装到BEGIN ... END结构中以创建Compound Statement

CREATE PROCEDURE 在其主体中需要一个“有效的 SQL 例程语句”。使用复合语句语法允许将多个语句分组到单个代码块中并符合此要求。

【讨论】:

    【解决方案2】:

    您缺少IN-表示输入参数,我希望您在最后一行有一个END

    试试这样的改变:

    CREATE PROCEDURE videodb.addVideo(IN vidTitle VARCHAR(255), IN vidDescription VARCHAR(500), IN producerArray VARCHAR(500), IN actorArray VARCHAR(500), OUT vidSuccess BOOL)
    BEGIN
        START TRANSACTION;
                SET @videoInsertVar = 'INSERT INTO videodb.videos (id, title, description) VALUES(?, ?, ?)';
                SET @videoId = NULL;
                SET @videoTitle = vidTitle; -- this is line 69
    

    还要确保你已经设置了DELIMITER,否则;将被视为存储过程的结束。

    【讨论】:

    • 其实每个参数默认都是一个IN参数。见dev.mysql.com/doc/refman/5.6/en/create-procedure.html
    • 您错过了下一行:将参数指定为 IN、OUT 或 INOUT 仅对 PROCEDURE 有效。对于 FUNCTION,参数始终被视为 IN 参数。
    • 我没有错过那句话;但是,您显然误解了它。该行,换句话说,只是说明您不能为函数指定OUTINOUT
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 2019-10-02
    相关资源
    最近更新 更多