トップ   編集 凍結 差分 バックアップ 添付   新規   最終更新のRSS

mysql/ストアドファンクションサンプル

Last-modified: 2008-12-22 (月) 23:28:45 (15d)
Top / mysql / ストアドファンクションサンプル

ストアドファンクション

伝票番号を自動採番して返すストアドファンクションの例

実行準備

テーブルとデータを作成

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)
  編集