mysql/ストアドファンクションサンプル
Last-modified: 2008-12-22 (月) 23:28:45 (15d)
ストアドファンクション †
伝票番号を自動採番して返すストアドファンクションの例 †
実行準備 †
テーブルとデータを作成
DROP TABLE IF EXISTS `mtb_slip_auto_numbering`;
CREATE TABLE IF NOT EXISTS `mtb_slip_auto_numbering` (
`slip_mark` varchar(5) NOT NULL,
`channel` varchar(2) NOT NULL,
`seqno_current_date` date NOT NULL,
`seqno_current_value` decimal(10,0) NOT NULL,
PRIMARY KEY (`slip_mark`,`channel`)
);
INSERT INTO `mtb_slip_auto_numbering` VALUES
('SO', '01', '2008-10-22', 3),
('SO', '02', '2008-10-22', 14);
ソースコード †
mysqlへの登録方法はmysql/ストアドプロシージャ登録方法を参照
delimiter //
DROP FUNCTION IF EXISTS `fn_get_slip_auto_numbering`//
CREATE FUNCTION `fn_get_slip_auto_numbering`
(
I_SLIP_MARK VARCHAR(5),
I_CHANNEL VARCHAR(2),
I_TARGET_DATE DATE
)
RETURNS VARCHAR(16)
DETERMINISTIC
BEGIN
DECLARE V_SEQNO_CURRENT_DATE DATE;
DECLARE V_SEQNO_CURRENT_VALUE DECIMAL(10,0);
SET V_SEQNO_CURRENT_VALUE = (
SELECT `seqno_current_value` +1
FROM `mtb_slip_auto_numbering`
WHERE `slip_mark` = I_SLIP_MARK
AND `seqno_current_date` = I_TARGET_DATE
AND `channel` = I_CHANNEL
);
IF V_SEQNO_CURRENT_VALUE IS NULL THEN
SET V_SEQNO_CURRENT_DATE = CURRENT_DATE;
SET V_SEQNO_CURRENT_VALUE = 1;
ELSE
SET V_SEQNO_CURRENT_DATE = I_TARGET_DATE;
END IF;
UPDATE `mtb_slip_auto_numbering`
SET
`seqno_current_date` = V_SEQNO_CURRENT_DATE,
`seqno_current_value` = V_SEQNO_CURRENT_VALUE
WHERE `slip_mark` = I_SLIP_MARK
AND `channel` = I_CHANNEL;
RETURN CONCAT(I_CHANNEL, DATE_FORMAT(V_SEQNO_CURRENT_DATE, '%y%m%d'), LPAD(V_SEQNO_CURRENT_VALUE, 5, '0'));
END
//
delimiter ;
実行 †
mysql> SELECT fn_get_slip_auto_numbering('SO', '01', CURRENT_DATE);
+------------------------------------------------------+
| fn_get_slip_auto_numbering('SO', '01', CURRENT_DATE) |
+------------------------------------------------------+
| 0108102300001 |
+------------------------------------------------------+
1 row in set (0.01 sec)