繁体   English   中英

mysql过程中的语法错误错误代码1064

[英]syntax error in mysql procedure error code 1064

我正在尝试编写一个过程,但出现语法错误。 我试图在网络的帮助下修复该问题,但失败了。

这是我的存储过程。 有什么帮助吗?

场景是我试图从表旅馆中获取workspaceid列值,并试图将该值作为我对另一个表的列。 然后我试图用;更新相同的列值; 给定新创建的table2中酒店表的给定开始和结束时间。

我的两个桌子是

CREATE TABLE `hotelings` (
  `HotelingId` int(11) NOT NULL AUTO_INCREMENT,
  `Description` longtext,
  `StartDate` datetime NOT NULL,
  `EndDate` datetime NOT NULL,
  `BookedBy` longtext,
  `BookingType` int(11) NOT NULL,
  `RepeatType` longtext,
  `RepeatDay` longtext,
  `ProjectId` int(11) NOT NULL,
  `WorkSpaceId` int(11) NOT NULL,
  `starttime` varchar(45) DEFAULT NULL,
  `endtime` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`HotelingId`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;



CREATE TABLE `hotelingtime` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `Time` time DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

我的程序是:

    DELIMITER $$

    CREATE DEFINER=`root`@`localhost` PROCEDURE `new_procedure`()
    BEGIN

    SET @sql = NULL;
    SELECT
      GROUP_CONCAT(DISTINCT
        CONCAT(
          'MAX(CASE WHEN workspaceid = ''',
          workspaceid,
          ''' then "" ELSE NULL end) AS ',
          CONCAT('`',workspaceid,'`')
        )
      ) INTO @sql
    FROM sms.hotelings;

    SET @sql = CONCAT('CREATE TABLE IF NOT EXISTS table2 AS SELECT t.Time as Time, ', @sql, ' FROM sms.hotelings h, sms.hotelingtime t 
                       GROUP BY t.Time');

    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;

    begin
    declare num_rows int;
    declare i int;
    declare col_name varchar(50);
    declare v varchar(10); 
    DECLARE v_finished INTEGER DEFAULT 0;

    -- cursor to fetch column names
    DECLARE col_names CURSOR FOR
      SELECT column_name
      FROM INFORMATION_SCHEMA.COLUMNS
      WHERE table_name = 'table2'
      ORDER BY ordinal_position; 
        -- declare NOT FOUND handler
        DECLARE CONTINUE HANDLER 
            FOR NOT FOUND SET v_finished = 1;

        OPEN col_names;

        temp_hotelingloop: LOOP

            FETCH col_names INTO col_name;

            IF v_finished = 1 THEN 
                LEAVE temp_hotelingloop;
            END IF;

    begin
    declare starttime time;
    declare endtime time;

    -- cursor to fetch start and end for a given workspaceid
    DECLARE startendTime CURSOR FOR
      SELECT starttime, endtime from hotelings
    where workspaceid = col_name;

     OPEN startendTime;
     FETCH startendTime INTO starttime, endtime;

-- i am getting error here and not giving me the result. 
    SET @sql = CONCAT('update table2 set ''',@col_name ,''' = '';'' where time between ''',@starttime,''' and ''',@endtime,'''');
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;

    CLOSE startendTime;
    end;
        SET i = i + 1;  

         END LOOP temp_hotelingloop;

        CLOSE col_names;

    end;
     select * from table2;
    DROP  TABLE table2;

    END

有什么帮助吗?

提前致谢

SET @sql = CONCAT('update table2 set ''',@col_name ,''' = '';'' where time between ''',@starttime,''' and ''',@endtime,'''');

您在此处使用@col_name,但声明中缺少@

declare col_name varchar(50);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM