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

时间:2014-08-06 05:31:02

标签: mysql sql stored-procedures

我正在尝试编写一个过程,我收到语法错误。我试图在网络的帮助下解决这个问题,但失败了。

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

方案是我试图从表酒店中获取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

请帮忙吗?

提前致谢

1 个答案:

答案 0 :(得分:0)

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

您在这里使用@col_name,但在您的声明中缺少@

declare col_name varchar(50);