CONCAT・EXECUTEで動的なSQL文 MYSQL編

VB Tips And Sample(HOME)(SQL 目次)

MYSQL CONCATで動的なSQL文の実行
せっかくストアドプロシージャが使えるのだから、動的なSQL文が書けたらコードが少なくてすむのになーーー、
と思ってやってみたサンプルです。
また、よくある、一時テーブル、ループも取り入れてみました。
で、動的な変数が、動的な定数として(この場合、定数と言っていいのかな?)扱われるか、動的なフィールド名として扱われるかは、””を付けるか付けないかで分かれるようです。
当然と言えば当然か。
定数としたい場合は””で囲む
フィールド名の場合は、そのままでOK
ちなみに、KEN_ALL は全国郵便番号のテーブル。
CONCAT・EXECUTEで動的なSQL文
DELIMITER $$

CREATE DEFINER=`root`@`%` PROCEDURE `new_routine1`()
BEGIN
  DECLARE str varchar(20);
  DECLARE str2 varchar(20);
  DECLARE vari varchar(100);
  DECLARE v1 INT DEFAULT 5;
   SET str = 'i';
   SET str2 = 'd';
    -- SELECT CONCAT('i','d') FROM `test`.`KEN_ALL`; -- 定数として扱われる
   -- SELECT str FROM `test`.`KEN_ALL`; -- strはフィールド名ではなく、定数として扱われる
   -- select CONCAT(str,'') FROM `test`.`KEN_ALL`; -- strはフィールド名ではなく、定数として扱われる
 
   -- フィールド名として扱われる
   -- SET @sqlstr =CONCAT('select ',str,str2,' FROM `test`.`KEN_ALL`');

   CREATE TEMPORARY TABLE IF NOT EXISTS tbl_MyTable(
     VARI varchar(100)
     ,ID varchar(100)
   );
 WHILE v1 > 0 DO
    set vari ='定数として扱われたい';
    -- SET @sqlstr =CONCAT('select ','',vari,',',str,str2,' FROM `test`.`KEN_ALL`'); -- フィールド名として扱われる
    -- SET @sqlstr =CONCAT('select "定数として扱われる", ',str,str2,' FROM `test`.`KEN_ALL`');

    SET @sqlstr =CONCAT('INSERT INTO tbl_MyTable select "',vari , CAST(v1 AS CHAR),'",',str,str2,' FROM test.KEN_ALL WHERE id=74427');
    
    PREPARE stmt from @sqlstr;
    EXECUTE stmt ;
    DEALLOCATE PREPARE stmt;
    SET v1 = v1 - 1;
 END WHILE;

  SELECT * FROM tbl_MyTable;

END
CONCAT・EXECUTEで動的なSQL文実行結果
 

VB Tips And Sample(HOME)