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

mysql/ストアドファンクションサンプル の変更点

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

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