【问题标题】:Can't create stored function - wrong syntax?无法创建存储函数 - 语法错误?
【发布时间】:2011-09-08 09:22:16
【问题描述】:

我有以下问题。

我想创建一个存储函数,将 entity_id 转换为相应的 sku

代码如下:

CREATE FUNCTION `id2sku`(`entity_id_in` INT)
    RETURNS VARCHAR
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
    DECLARE returnvalue varchar(50);

    SELECT `sku` INTO returnvalue FROM catalog_product_entity WHERE entity_id = entity_id_in LIMIT 1;

    return returnvalue;
END

现在我的问题是,如果我触发查询,我会收到以下消息: [窗口标题] 错误

SQL Error (1064): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT' at line 3

我使用的数据库是 MySQL 5.0.51a

提前感谢您的想法。

【问题讨论】:

    标签: mysql sql database stored-procedures stored-functions


    【解决方案1】:

    MySQL默认使用;作为分隔符,所以当它在第9行遇到;时:

     DECLARE returnvalue varchar(50);
    

    MySQL 认为命令结束 - 它正在尝试执行:

    CREATE FUNCTION `id2sku`(`entity_id_in` INT)
        RETURNS VARCHAR(50)
        LANGUAGE SQL
        NOT DETERMINISTIC
        CONTAINS SQL
        SQL SECURITY DEFINER
        COMMENT ''
    BEGIN
        DECLARE returnvalue varchar(50);
    

    这不是有效的 SQL。

    设置新的分隔符:

     DELIMITER $$
    
     CREATE FUNCTION `id2sku`(`entity_id_in` INT)
        RETURNS VARCHAR(50)
        LANGUAGE SQL
        NOT DETERMINISTIC
        CONTAINS SQL
        SQL SECURITY DEFINER
        COMMENT ''
    BEGIN
        DECLARE returnvalue varchar(50);
    
        SELECT `sku` INTO returnvalue FROM catalog_product_entity WHERE entity_id = entity_id_in LIMIT 1;
    
        return returnvalue;
    END
    $$
    

    然后您可以使用以下命令更改分隔符:

    DELIMITER ;
    

    【讨论】:

      【解决方案2】:

      这应该可行:

      DELIMITER $$
      
      CREATE FUNCTION `id2sku`(`entity_id_in` INT)
          RETURNS VARCHAR(50)
          LANGUAGE SQL
          NOT DETERMINISTIC
          CONTAINS SQL
          SQL SECURITY DEFINER
          COMMENT ''
      BEGIN
          DECLARE returnvalue VARCHAR(50);
      
          SELECT `sku` INTO returnvalue FROM catalog_product_entity WHERE entity_id = entity_id_in LIMIT 1;
      
          RETURN returnvalue;
      
          END$$
      
      DELIMITER ;
      

      您没有指定 varchar 长度。 :-)

      【讨论】:

      • 很好,我认为你很接近。不过,我仍然收到以下错误。 [窗口标题] ..."在第 9 行的 '' 附近使用正确的语法"
      • 如果可以的话,我会接受这两个答案,因为你们俩都是对的。
      • 我刚刚复制并粘贴了您的代码,但生成了错误Cannot load from mysql.proc. The table is probably corrupted。请帮助我这里有什么问题?我正在使用mysql版本5.5.30-log
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多