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

mysqlストアドプロシージャサンプル

Last-modified: 2009-05-30 (土) 20:03:56 (283d)
Top / mysql / ストアドプロシージャサンプル

ストアドプロシージャ

カーソルを使用したストアドプロシージャの例

実行準備

テーブルとデータを作成

DROP TABLE IF EXISTS `wtb_products_search2`;
CREATE TABLE IF NOT EXISTS `wtb_products_search2` (
  `product_id` int(11) NOT NULL,
  `brand_id` int(11) NOT NULL,
  `season_id` smallint(6) NOT NULL default '0',
  `item1_id` smallint(6) NOT NULL default '0',
  PRIMARY KEY  (`product_id`)
);

INSERT INTO `wtb_products_search2` VALUES
('1', '1', '1', '1'),
('2', '2', '1', '1'),
('3', '1', '1', '1');

ソースコード

mysqlへの登録方法はmysql/ストアドプロシージャ登録方法を参照

delimiter //

DROP PROCEDURE IF EXISTS `prc_update_product_search_sale_amt`//
CREATE PROCEDURE `prc_update_product_search_sale_amt`
(
    /*パラメータ*/
    IN I_TARGET_DATE DATETIME,
    IN I_BRAND_ID INT
)
BEGIN

/*カーソル用の変数宣言*/
DECLARE V_DONE TINYINT DEFAULT 0;
DECLARE C_PRODUCT_ID INT;
DECLARE C_SEASON_ID INT;
DECLARE C_BRAND_ID INT;
DECLARE C_ITEM1_ID INT;

/*カーソル定義*/
DECLARE CUR_PROD_SEARCH CURSOR FOR
SELECT
    `product_id`,
    `season_id`,
    `brand_id`,
    `item1_id`
FROM `wtb_products_search2`
WHERE I_BRAND_ID = ''
OR (I_BRAND_ID <> '' AND brand_id = I_BRAND_ID);


/*カーソルの終了条件に使用する変数を定義*/
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET V_DONE = 1;

/*カーソルをオープンしてループする*/
OPEN CUR_PROD_SEARCH;

/* SQLSTATE '02000'が発生するまでループ*/
LABEL1: REPEAT
    
    FETCH CUR_PROD_SEARCH INTO 
    C_PRODUCT_ID, C_SEASON_ID, C_BRAND_ID, C_ITEM1_ID;
    
    IF NOT V_DONE THEN
        
        SELECT C_PRODUCT_ID, C_SEASON_ID, C_BRAND_ID, C_ITEM1_ID;
        
    END IF;
    
UNTIL V_DONE END REPEAT;

CLOSE CUR_PROD_SEARCH;

END
//

delimiter ;

実行

mysql> call prc_update_product_search_sale_amt(CURRENT_TIMESTAMP, '1');
+--------------+-------------+------------+------------+
| C_PRODUCT_ID | C_SEASON_ID | C_BRAND_ID | C_ITEM1_ID |
+--------------+-------------+------------+------------+
|            1 |           1 |          1 |          1 |
+--------------+-------------+------------+------------+
1 row in set (0.00 sec)

+--------------+-------------+------------+------------+
| C_PRODUCT_ID | C_SEASON_ID | C_BRAND_ID | C_ITEM1_ID |
+--------------+-------------+------------+------------+
|            3 |           1 |          1 |          1 |
+--------------+-------------+------------+------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)
  編集