#norelated
#title(mysqlストアドファンクションサンプル)
* ストアドファンクション [#g243b1ef]
#contents
** 伝票番号を自動採番して返すストアドファンクションの例 [#x674bb67]
** hollo world文字列を返すストアドファンクションの例 [#x674bb67]
*** 実行準備 [#v38ea955]
テーブルとデータを作成
*** このサンプルは [#jc87e3dc]
引数に数字を渡すと、hello_worldの文字列に引数の数字を結合して返すサンプルです。
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);
*** ソースコード [#rb71bfa0]
mysqlへの登録方法は[[mysql/ストアドプロシージャ登録方法]]を参照
delimiter //
DROP FUNCTION IF EXISTS `fn_get_slip_auto_numbering`//
CREATE FUNCTION `fn_get_slip_auto_numbering`
DROP FUNCTION IF EXISTS `fn_hello_world`//
CREATE FUNCTION `fn_hello_world`
(
I_SLIP_MARK VARCHAR(5),
I_CHANNEL VARCHAR(2),
I_TARGET_DATE DATE
I_NUMBER1 INT,
I_NUMBER2 INT
)
RETURNS VARCHAR(16)
RETURNS VARCHAR(50)
DETERMINISTIC
BEGIN
DECLARE V_SEQNO_CURRENT_DATE DATE;
DECLARE V_SEQNO_CURRENT_VALUE DECIMAL(10,0);
DECLARE V_HELLO_WORLD_STRING VARCHAR(50);
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
);
SET V_HELLO_WORLD_STRING = CONCAT('HELLO WORLD', I_NUMBER1, I_NUMBER2);
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;
RETURN V_HELLO_WORLD_STRING;
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 ;
*** 実行 [#jdf6927d]
mysql> SELECT fn_get_slip_auto_numbering('SO', '01', CURRENT_DATE);
+------------------------------------------------------+
| fn_get_slip_auto_numbering('SO', '01', CURRENT_DATE) |
+------------------------------------------------------+
| 0108102300001 |
+------------------------------------------------------+
mysql> SELECT fn_hello_world(1,2);
+---------------------+
| fn_hello_world(1,2) |
+---------------------+
| hello world12 |
+---------------------+
1 row in set (0.01 sec)