CONCAT・EXECUTEで動的なSQL文 MYSQL編
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
|