【问题标题】:MySQL procedure syntax error with create table statementMySQL 过程语法错误与 create table 语句
【发布时间】:2016-08-30 19:06:34
【问题描述】:

以下代码在没有 create table 语句的情况下完美运行。我花了一个小时看这个简单的代码来发现错误。

DELIMITER $$

    USE `operations`$$

    DROP PROCEDURE IF EXISTS `rc_pending_data_tat_proc`$$

    CREATE PROCEDURE `rc_pending_data_tat_proc`()
    BEGIN
    (
    CREATE TABLE rc_pending_tat_temp /*works fine when I remove this*/

    SELECT IF(b.retailer IS NULL,a.retailer, b.retailer) AS Retailer,
     (CASE
     WHEN DATEDIFF(criteria_date,transaction_date)<=50
     THEN '<=50'
     WHEN DATEDIFF(criteria_date,transaction_date) <=70
     THEN '<=70'
     WHEN DATEDIFF(criteria_date,transaction_date) <=80
     THEN '<=80'
     WHEN DATEDIFF(criteria_date,transaction_date) <=90
     THEN '<=90'
     ELSE 
     '>90'
     END) AS Pending_since
     , COUNT(*) AS `count`, CURRENT_TIMESTAMP AS `date`
      FROM `rc_pending_data` a
      LEFT JOIN `rc_store_retailer_mapping` b
      ON a.retailer=b.store_name
    GROUP BY 1,2
    );
        END$$

    DELIMITER ;

它给出的错误是非常标准的,即

错误代码:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在“创建表 rc_pending_tat_temp”附近使用的正确语法 SELECT IF(b.retailer IS NULL,a.retailer, b.ret' 在第 4 行

【问题讨论】:

    标签: mysql stored-procedures mysql-error-1064 create-table


    【解决方案1】:

    请删除存储过程的GROUP BY 1,2 部分之后的“(”BEGIN 和“)”。我在没有开始和结束括号的情况下尝试了这个,它对我有用。

    【讨论】:

    • 嗨 Nitin,感谢您的帮助。通过 hit and try 方法找到错误,就是这样!
    【解决方案2】:

    您好,我通过良好的老命中和尝试方法发现了这个问题,结果发现那些额外的括号 () 导致了语法错误。删除它们,代码就像魅力一样工作!

    DELIMITER $$
    
        USE `operations`$$
    
        DROP PROCEDURE IF EXISTS `rc_pending_data_tat_proc`$$
    
        CREATE PROCEDURE `rc_pending_data_tat_proc`()
        BEGIN
        (
        CREATE TABLE rc_pending_tat_temp /*works fine when I remove this*/
    
        SELECT IF(b.retailer IS NULL,a.retailer, b.retailer) AS Retailer,
         (CASE
         WHEN DATEDIFF(criteria_date,transaction_date)<=50
         THEN '<=50'
         WHEN DATEDIFF(criteria_date,transaction_date) <=70
         THEN '<=70'
         WHEN DATEDIFF(criteria_date,transaction_date) <=80
         THEN '<=80'
         WHEN DATEDIFF(criteria_date,transaction_date) <=90
         THEN '<=90'
         ELSE 
         '>90'
         END) AS Pending_since
         , COUNT(*) AS `count`, CURRENT_TIMESTAMP AS `date`
          FROM `rc_pending_data` a
          LEFT JOIN `rc_store_retailer_mapping` b
          ON a.retailer=b.store_name
        GROUP BY 1,2
        );
            END$$
    
        DELIMITER ;
    

    【讨论】:

      【解决方案3】:

      在我看来,SQL 不喜欢您的查询试图创建一个空表这一事实。

      我只是在 Google 上四处搜索,看看您是否可以创建一个没有任何列的表格,看起来这通常不是一件容易的事情。如果您出于某种特定原因想创建一个空表,那似乎是另一回事。但是,如果您想解决此问题,请在表格中至少添加一列。像这样的:

      CREATE TABLE rc_pending_tat_temp(Id INT);
      

      这应该让您的查询运行。

      编辑:

      听起来您想创建一个新表来存储SELECT 语句的结果。为此,请查看SELECT INTO 语句here 的语法。这将允许您根据 SELECT 语句的结果创建一个表。

      在这种情况下,您应该删除此行:

      CREATE TABLE rc_pending_tat_temp
      

      然后加上:

      INTO rc_pending_tat_temp
      

      所以你的查询最终应该是这样的:

      DELIMITER $$
      
          USE `operations`$$
      
          DROP PROCEDURE IF EXISTS `rc_pending_data_tat_proc`$$
      
          CREATE PROCEDURE `rc_pending_data_tat_proc`()
          BEGIN
          (
              SELECT IF(b.retailer IS NULL,a.retailer, b.retailer) AS Retailer,
               (CASE
               WHEN DATEDIFF(criteria_date,transaction_date)<=50
               THEN '<=50'
               WHEN DATEDIFF(criteria_date,transaction_date) <=70
               THEN '<=70'
               WHEN DATEDIFF(criteria_date,transaction_date) <=80
               THEN '<=80'
               WHEN DATEDIFF(criteria_date,transaction_date) <=90
               THEN '<=90'
               ELSE 
               '>90'
               END) AS Pending_since
           , COUNT(*) AS `count`, CURRENT_TIMESTAMP AS `date`
            INTO rc_pending_tat_temp
            FROM `rc_pending_data` a
            LEFT JOIN `rc_store_retailer_mapping` b
            ON a.retailer=b.store_name
            GROUP BY 1,2
          );
          END$$
      
      DELIMITER ;
      

      【讨论】:

      • 您好 Malcom,我正在通过 create table 语句下方使用的 select 语句向表中添加列。我无法理解这个错误背后的原因。
      • @RahulChawla 那么看起来您可能正在寻找 SELECT INTO 语法。看看这个链接:link我会用一个例子在这个答案中添加一个单独的例子。
      猜你喜欢
      • 2012-07-08
      • 1970-01-01
      • 2018-06-06
      • 2017-06-30
      • 1970-01-01
      • 2021-07-29
      • 2012-03-26
      • 1970-01-01
      相关资源
      最近更新 更多