循环遍历列名和插入值

时间:2014-01-01 05:26:05

标签: mysql

我需要帮助循环遍历列并将值插入列。

我的对象: - 使用存储过程将新值插入表中的选择列 我正在使用case语句进行选择性选择并循环更新列列表

我的代码:

  DELIMITER $$
  USE `test`$$
  DROP PROCEDURE IF EXISTS `loopcolnm1`$$
  CREATE DEFINER=`root`@`localhost` PROCEDURE `loopcolnm1`()

  BEGIN
  DECLARE sColName  VARCHAR(255);
  DECLARE sEgStr  VARCHAR(255);
  DECLARE X  INT;
  SET segstr = ' ';
  SET X = 0;
  Loop_label : LOOP 
  IF  X > 9 THEN LEAVE  loop_label;
  END  IF;
  SET X = X+1;
  CASE 
        WHEN X= 1 THEN  
        SET sColName = 'age' ;
        WHEN X= 2 THEN  SET sColName  = 'Gender' ;
        WHEN X= 3 THEN  SET sColName  = 'incm_rng' ;
        WHEN X= 4 THEN  SET sColName  = 'Prc_rng' ;
        WHEN X= 5 THEN  SET sColName  = 'prop_purp';
        WHEN X= 6 THEN  SET sColName  = 'time_rng'  ;
        WHEN X= 7 THEN  SET sColName  = 'time_rsn' ;
        WHEN X= 8 THEN  SET sColName = 'crrnt_dmcl' ;
        WHEN X= 9 THEN  SET sColName  = 'Prop_Rsn' ;
        ELSE  SET sColName  = '\'All\' as Sub_Crit';

  END CASE ;
  SET sEgStr = CONCAT(sEgstr,' ',X, ' ',',' ,sColName, ' '); -- test variable

  INSERT INTO lptable (sColName) 
  VALUE ( CONCAT('loop + ',X));

  END LOOP; 
  SELECT segstr AS cnct;
      END$$

  DELIMITER ;

或者我尝试使用类似的solution但是,在两个实例上我都会收到错误

编辑(1) - 附加信息

当我编译存储过程时,它不会抛出任何错误消息,但是当我调用存储过程时

CALL loopcolnm1();
  

错误代码:1054未知栏' sColName'在'字段列表'

我是mysql的新手,我不确定这是否是我可以做的事情,或者我在语法上犯了错误,请帮助

1 个答案:

答案 0 :(得分:0)

您的插入语句错误。您不能直接使用变量sColName作为列名。您应该通过连接部分字符串来生成INSERT查询字符串。

这是错误的:

INSERT INTO lptable (sColName) VALUE ( CONCAT('loop + ',X));

您必须使用VALUES,但不能使用VALUE

您还需要准备好的语句来执行动态组合的SQL语句。

您需要在程序中进行以下更改。

BEGIN  
   ...

    DECLARE table_fields_str     VARCHAR( 255 );
    DECLARE values_str           VARCHAR( 255 );
    DECLARE _temp_sql_insert_str VARCHAR( 255 );

   SET table_fields_str = CONCAT( 'INSERT INTO lptable (', sColName, ') ' );
   SET values_str       =  CONCAT( ' VALUES( CONCAT( ''loop '', ', X, ' ) )' );

   SELECT CONCAT( table_fields, values_str ) INTO @_temp_sql_insert_str;

   PREPARE stmt FROM @_temp_sql_insert_str;
   EXECUTE stmt;
END;