採番されてるべきコードの抜けが発生したテーブルを
単純に番号を割り振っていくプロシジャ、テーブル名や、コードのけた数など修正すれば、
使い回しができるプロシジャを書いてみた。
この例は、items というテーブルに、7桁のコード:0’ゼロ’埋めされてるコードで、抜けがあるものに、
強制的に指定する番号範囲から空いたコードを振って更新していく。
DELIMITER //
DROP PROCEDURE IF EXISTS sp_itemcode_asign
//
CREATE PROCEDURE sp_itemcode_asign(IN fromcode VARCHAR(7), IN tocode VARCHAR(7))
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE item_id INT;
DECLARE device_item_machine_no INT;
DECLARE codevalue INT;
DECLARE maxcodevalue INT;
DECLARE seqno INT DEFAULT 1;
DECLARE codecharcter VARCHAR(7);
-- カーソル定義
DECLARE cur CURSOR FOR
SELECT id FROM items WHERE COALESCE(jcode, '') = '' ORDER BY id ASC;
-- ハンドラ宣言
DECLARE EXIT HANDLER FOR NOT FOUND SET done = 0;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
-- シーケンスにコードを振る TEMPORARY TABLE
SET codevalue = CAST(fromcode AS SIGNED);
SET maxcodevalue = CAST(tocode AS SIGNED);
DROP TABLE IF EXISTS temp_codes;
CREATE TEMPORARY TABLE temp_codes (vcode VARCHAR(7), code_value INT);
WHILE codevalue <= maxcodevalue DO
INSERT INTO temp_codes SELECT LPAD(codevalue, 7, '0'), codevalue;
SET codevalue = codevalue + 1;
END WHILE;
-- 空きコードの TEMPORARY TABLE 。id でシーケンスに参照可能
DROP TABLE IF EXISTS temp_seq;
CREATE TEMPORARY TABLE temp_seq (id INT NOT NULL, vcode VARCHAR(7), code_value INT);
INSERT INTO temp_seq
SELECT @i:=@i+1, temp.vcode, temp.code_value
FROM (select @i:=0) AS dummy, temp_codes temp LEFT JOIN items i ON temp.vcode = i.jcode
WHERE COALESCE(jcode, '') = '';
-- 空きコードセット
OPEN cur;
REPEAT
FETCH cur INTO item_id;
IF NOT done THEN
SELECT vcode INTO codecharcter FROM temp_seq WHERE id = seqno;
UPDATE items SET jcode = codecharcter WHERE id = item_id;
SET seqno = seqno + 1;
END IF;
UNTIL done END REPEAT;
CLOSE cur;
END
//
DELIMITER ;
呼び出し例
call sp_itemcode_asign( '0001200' , '0009999' );