有表mp,内有字段en_name,保存的是地区的名称:
比如:
xj
js
等。
有表data_cycle,内有字段dcycle:
数据如下:
5m
2d
等。
想循环创建表
xj_status_5m
xj_status_2d
js_status_5m
js_status_2d创建了存储过程如下,但是在执行过程中老是报语法错误。
十分不解。
求教。
Mysql 版本 2.1.46CREATE PROCEDURE `Create_Table`( 
  )
BEGIN
  DECLARE done INT DEFAULT 0; 
  DECLARE name varchar(200) ;
  DECLARE id varchar(200) ;
  
  DECLARE b varchar(200) ; 
  DECLARE cur1 CURSOR FOR 
  select a.en_name, b.dcycle from mp a, data_cycle b;
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
 
  OPEN cur1;
  REPEAT
    FETCH cur1 INTO name,id;
    IF NOT done THEN 
       set b=concat('create table ',concat(concat(name,'_','status'), '_', id), 
       '(`host` varchar(16) NOT NULL, 
        `port` int(11) NOT NULL default 21108, 
        `runtime` bigint(10) default NULL,
        `querytime` datetime default NULL,
        `SysStatus` int(11) default 0,
        `SysDiskRemain` double(10,3),
        `SysDiskTotal` double(10,3),
        `SysCpuNum` int(11),
        `SysCpuIdle` double(5,2),
        `SysLoadAverage` double(8,5),
        `SysMemFree` double(10,3),
        `SysMemTotal` double(10,3),
        `SysSwapFree` double(10,3),
        `SysSwapTotal` double(10,3) ) ENGINE=MyISAM DEFAULT CHARSET=utf8'
       );
       
       SET @E=b; 
       PREPARE stmt1 FROM @E; 
          EXECUTE stmt1; 
          DEALLOCATE PREPARE stmt1;
    END IF;
  UNTIL done END REPEAT;
  CLOSE cur1;
END;

解决方案 »

  1.   

    http://topic.csdn.net/u/20100917/16/4407c078-138a-47e4-a03c-e5a0697e2f59.html表名称中间加了status,然后字段不是一个了,就搞不定了?I 服了 YOU    
      

  2.   

    CREATE PROCEDURE `Create_Table`( 
      )
    BEGIN
      DECLARE done INT DEFAULT 0; 
      DECLARE name varchar(200) ;
      DECLARE id varchar(200) ;
      
      DECLARE b varchar(200) ; 
      DECLARE cur1 CURSOR FOR 
      select a.en_name, b.dcycle from mp a, data_cycle b;
      DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
     
      OPEN cur1;
      REPEAT
        FETCH cur1 INTO name,id;
        IF NOT done THEN 
           set b=concat('create table `',name,'_','status', '_', id, 
           '` (`host` varchar(16) NOT NULL, 
            `port` int(11) NOT NULL default 21108, 
            `runtime` bigint(10) default NULL,
            `querytime` datetime default NULL,
            `SysStatus` int(11) default 0,
            `SysDiskRemain` double(10,3),
            `SysDiskTotal` double(10,3),
            `SysCpuNum` int(11),
            `SysCpuIdle` double(5,2),
            `SysLoadAverage` double(8,5),
            `SysMemFree` double(10,3),
            `SysMemTotal` double(10,3),
            `SysSwapFree` double(10,3),
            `SysSwapTotal` double(10,3) ) ENGINE=MyISAM DEFAULT CHARSET=utf8'
           );
           
           SET @E=b; 
           PREPARE stmt1 FROM @E; 
              EXECUTE stmt1; 
              DEALLOCATE PREPARE stmt1;
        END IF;
      UNTIL done END REPEAT;
      CLOSE cur1;
    END;
      

  3.   

    这个问题确实问了两次了。
    很惭愧。
    sql确实没怎么用过。
    这个存储过程,我从表面上看一点也看不出错误。
    但是运行的时候总是报set b=concat('create table ',concat(concat(name,'_','status'), '_', id), 
           '(`host` varchar(16) NOT NULL, 
            `port` int(11) NOT NULL default 21108, 
            `runtime` bigint(10) default NULL,
            `querytime` datetime default NULL,
            `SysStatus` int(11) default 0,
            `SysDiskRemain` double(10,3),
            `SysDiskTotal` double(10,3),
            `SysCpuNum` int(11),
            `SysCpuIdle` double(5,2),
            `SysLoadAverage` double(8,5),
            `SysMemFree` double(10,3),
            `SysMemTotal` double(10,3),
            `SysSwapFree` double(10,3),
            `SysSwapTotal` double(10,3) ) ENGINE=MyISAM DEFAULT CHARSET=utf8'
           );附近有错b表很简单:就一个字段dcycle.
    -------|
    dcycle |
    -------|
    5m     |
    -------|
    2h     |
    -------|
      

  4.   

    mysql> select * from data_cycle;
    +--------+
    | dcycle |
    +--------+
    | 5m     | 
    | 30m    | 
    | 2h     | 
    | 1d     | 
    +--------+
      

  5.   


    版主要你贴的是
    SET @E=b; 
    select b;
           PREPARE stmt1 FROM @E; 
              EXECUTE stmt1在存储过程里加上红色部分的,然后执行存储过程,贴出打印出来的B的内容。
      

  6.   

    执行存储过程的时候,set b=concat...就已经报语法错误了。
    无法执行的。
    我是用过Mysql-Front第三方数据库软件执行的。
      

  7.   

    create table `xnop003_status_5m` (`host` varchar(16) NOT NULL, 
            `port` int(11) NOT NULL default 21108, 
            `runtime` bigint(10) default NULL,
            `querytime` datetime default NULL,打印了一下,只有上面的内容。
      

  8.   

    DELIMITER $$USE `ee`$$DROP PROCEDURE IF EXISTS `test`$$CREATE DEFINER=`root`@`localhost` PROCEDURE `test`()
    BEGIN
           DECLARE done INT DEFAULT 0;
          DECLARE n1 VARCHAR(10);
          DECLARE n2 VARCHAR(10);
          DECLARE cur1 CURSOR FOR SELECT * FROM en_name,data_cycle;
           DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
        
           OPEN cur1;
           FETCH cur1 INTO n1,n2;
           WHILE done=0 DO
                  SET @sqlstmt=CONCAT('create table ',n1,'_',n2,'(id int)');
                   SET @b=CONCAT('create table ',CONCAT(CONCAT(n1,'_','status'), '_', n2), 
           '(`host` varchar(16) NOT NULL, 
            `port` int(11) NOT NULL default 21108, 
            `runtime` bigint(10) default NULL,
            `querytime` datetime default NULL,
            `SysStatus` int(11) default 0,
            `SysDiskRemain` double(10,3),
            `SysDiskTotal` double(10,3),
            `SysCpuNum` int(11),
            `SysCpuIdle` double(5,2),
            `SysLoadAverage` double(8,5),
            `SysMemFree` double(10,3),
            `SysMemTotal` double(10,3),
            `SysSwapFree` double(10,3),
            `SysSwapTotal` double(10,3) ) ENGINE=MyISAM DEFAULT CHARSET=utf8'
           );
           
                   
              PREPARE stmt1 FROM @b;
              EXECUTE stmt1 ;
              DEALLOCATE PREPARE stmt1;
                 FETCH cur1 INTO n1,n2;
           END WHILE;
        END$$DELIMITER ;
      

  9.   

    omg,BZ你的代码是OK的.
    不过还是没有明白,为什么我贴的代码会有语法错误.
      

  10.   

    CSDN更多的是提供一种解决办法的思路,而不是伸手要代码的地方。举一反三,多测多练,自己提高,这样才符合CSDN的宗旨。