<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://mochiu.net/index.php?action=history&amp;feed=atom&amp;title=MySQL_-_%E3%82%B9%E3%83%88%E3%82%A2%E3%83%89%E3%83%97%E3%83%AD%E3%82%B7%E3%83%BC%E3%82%B8%E3%83%A3</id>
	<title>MySQL - ストアドプロシージャ - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="https://mochiu.net/index.php?action=history&amp;feed=atom&amp;title=MySQL_-_%E3%82%B9%E3%83%88%E3%82%A2%E3%83%89%E3%83%97%E3%83%AD%E3%82%B7%E3%83%BC%E3%82%B8%E3%83%A3"/>
	<link rel="alternate" type="text/html" href="https://mochiu.net/index.php?title=MySQL_-_%E3%82%B9%E3%83%88%E3%82%A2%E3%83%89%E3%83%97%E3%83%AD%E3%82%B7%E3%83%BC%E3%82%B8%E3%83%A3&amp;action=history"/>
	<updated>2026-06-13T23:54:02Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://mochiu.net/index.php?title=MySQL_-_%E3%82%B9%E3%83%88%E3%82%A2%E3%83%89%E3%83%97%E3%83%AD%E3%82%B7%E3%83%BC%E3%82%B8%E3%83%A3&amp;diff=14293&amp;oldid=prev</id>
		<title>Wiki: ページの作成:「== 概要 == MySQLのストアドプロシージャ (Stored Procedure) は、一連のSQL文をデータベース内に保存し、名前を付けて呼び出せるようにするプログラム単位である。&lt;br&gt; 複雑な処理をカプセル化し、再利用性とメンテナンス性を向上させることができる。&lt;br&gt; &lt;br&gt; ストアドプロシージャは、パラメータを受け取り、複雑な制御フロー構文 (&lt;code&gt;IF&lt;/code&gt;、&lt;code&gt;CASE…」</title>
		<link rel="alternate" type="text/html" href="https://mochiu.net/index.php?title=MySQL_-_%E3%82%B9%E3%83%88%E3%82%A2%E3%83%89%E3%83%97%E3%83%AD%E3%82%B7%E3%83%BC%E3%82%B8%E3%83%A3&amp;diff=14293&amp;oldid=prev"/>
		<updated>2026-02-15T09:02:43Z</updated>

		<summary type="html">&lt;p&gt;ページの作成:「== 概要 == MySQLのストアドプロシージャ (Stored Procedure) は、一連のSQL文をデータベース内に保存し、名前を付けて呼び出せるようにするプログラム単位である。&amp;lt;br&amp;gt; 複雑な処理をカプセル化し、再利用性とメンテナンス性を向上させることができる。&amp;lt;br&amp;gt; &amp;lt;br&amp;gt; ストアドプロシージャは、パラメータを受け取り、複雑な制御フロー構文 (&amp;lt;code&amp;gt;IF&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;CASE…」&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 概要 ==&lt;br /&gt;
MySQLのストアドプロシージャ (Stored Procedure) は、一連のSQL文をデータベース内に保存し、名前を付けて呼び出せるようにするプログラム単位である。&amp;lt;br&amp;gt;&lt;br /&gt;
複雑な処理をカプセル化し、再利用性とメンテナンス性を向上させることができる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
ストアドプロシージャは、パラメータを受け取り、複雑な制御フロー構文 (&amp;lt;code&amp;gt;IF&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;CASE&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;LOOP&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;WHILE&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;REPEAT&amp;lt;/code&amp;gt;) を使用して処理を実行できる。&amp;lt;br&amp;gt;&lt;br /&gt;
また、カーソルを使用して結果セットを行単位で処理したり、ハンドラーを使用してエラーや例外を処理することもできる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;ストアドプロシージャは、&amp;lt;code&amp;gt;CALL&amp;lt;/code&amp;gt; 文で呼び出され、IN (入力)、OUT (出力)、INOUT (入出力) の3種類のパラメータをサポートする。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;OUT および INOUT パラメータを使用することで、呼び出し側に値を返すことができる。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
ストアドプロシージャの主なメリットには、ネットワークトラフィックの削減、セキュリティの向上、コードの一元管理がある。&amp;lt;br&amp;gt;&lt;br /&gt;
アプリケーション側で複数のSQL文を個別に実行する代わりに、サーバ側で一括処理できるため、パフォーマンスが向上する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
ストアドプロシージャは、データベース内に永続化されるため、&amp;lt;code&amp;gt;SHOW CREATE PROCEDURE&amp;lt;/code&amp;gt; 文や &amp;lt;code&amp;gt;INFORMATION_SCHEMA.ROUTINES&amp;lt;/code&amp;gt; テーブルから定義を確認できる。&amp;lt;br&amp;gt;&lt;br /&gt;
プロシージャ本体を変更する場合は、DROP + CREATE による再作成が必要である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;ストアドプロシージャと類似した機能として、ストアドファンクション (Stored Function) がある。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;ファンクションはRETURN文で単一の値を返し、SELECT文内で使用できるが、プロシージャは &amp;lt;code&amp;gt;CALL&amp;lt;/code&amp;gt; 文で呼び出し、OUT / INOUTパラメータで複数の値を返す点で異なる。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ストアドプロシージャの作成 ==&lt;br /&gt;
==== 基本構文 ====&lt;br /&gt;
ストアドプロシージャを作成するには、&amp;lt;code&amp;gt;CREATE PROCEDURE&amp;lt;/code&amp;gt; 文を使用する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
完全な構文を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE&lt;br /&gt;
    [DEFINER = user]&lt;br /&gt;
    PROCEDURE [IF NOT EXISTS] &amp;lt;プロシージャ名&amp;gt; ([&amp;lt;パラメータ&amp;gt;[,...]])&lt;br /&gt;
    [characteristic ...]&lt;br /&gt;
    routine_body&lt;br /&gt;
 &lt;br /&gt;
 proc_parameter:&lt;br /&gt;
    [ IN | OUT | INOUT ] param_name type&lt;br /&gt;
 &lt;br /&gt;
 characteristic: {&lt;br /&gt;
    COMMENT &amp;#039;string&amp;#039;&lt;br /&gt;
  | LANGUAGE SQL&lt;br /&gt;
  | [NOT] DETERMINISTIC&lt;br /&gt;
  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }&lt;br /&gt;
  | SQL SECURITY { DEFINER | INVOKER }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 routine_body:&lt;br /&gt;
    Valid SQL routine statement&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
基本的な例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DELIMITER //&lt;br /&gt;
 &lt;br /&gt;
 CREATE PROCEDURE simple_proc()&lt;br /&gt;
 BEGIN&lt;br /&gt;
    SELECT &amp;#039;Hello, World!&amp;#039;;&lt;br /&gt;
 END//&lt;br /&gt;
 &lt;br /&gt;
 DELIMITER ;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;DELIMITER&amp;lt;/code&amp;gt; 文は、ストアドプロシージャ内でセミコロン (;) を使用するため、一時的にデリミタを変更する必要がある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;DELIMITER //&amp;lt;/code&amp;gt; で変更し、プロシージャ定義の最後に &amp;lt;code&amp;gt;DELIMITER ;&amp;lt;/code&amp;gt; で元に戻す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
IF NOT EXISTS句を指定すると、同名のプロシージャが既に存在する場合にエラーにならず、警告のみが出力される。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DELIMITER //&lt;br /&gt;
 &lt;br /&gt;
 CREATE PROCEDURE IF NOT EXISTS get_user_count()&lt;br /&gt;
 BEGIN&lt;br /&gt;
    SELECT COUNT(*) FROM users;&lt;br /&gt;
 END//&lt;br /&gt;
 &lt;br /&gt;
 DELIMITER ;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== パラメータの種類 ====&lt;br /&gt;
ストアドプロシージャのパラメータには、IN、OUT、INOUTの3種類がある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ パラメータの種類&lt;br /&gt;
! パラメータ !! 説明&lt;br /&gt;
|-&lt;br /&gt;
| IN&lt;br /&gt;
|&lt;br /&gt;
* 入力パラメータ (デフォルト)&lt;br /&gt;
* 呼び出し側からプロシージャに値を渡す&lt;br /&gt;
* プロシージャ内での変更は呼び出し側に影響しない&lt;br /&gt;
|-&lt;br /&gt;
| OUT&lt;br /&gt;
|&lt;br /&gt;
* 出力パラメータ&lt;br /&gt;
* プロシージャから呼び出し側に値を返す&lt;br /&gt;
* プロシージャ開始時にNULLで初期化される&lt;br /&gt;
|-&lt;br /&gt;
| INOUT&lt;br /&gt;
|&lt;br /&gt;
* 入出力パラメータ&lt;br /&gt;
* 呼び出し側からの入力値を受け取り、プロシージャ内で変更した値を呼び出し側に返す&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
各パラメータの使用例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DELIMITER //&lt;br /&gt;
 &lt;br /&gt;
 CREATE PROCEDURE calc_total(&lt;br /&gt;
    IN price DECIMAL(10,2),&lt;br /&gt;
    IN quantity INT,&lt;br /&gt;
    OUT total DECIMAL(10,2)&lt;br /&gt;
 )&lt;br /&gt;
 BEGIN&lt;br /&gt;
    SET total = price * quantity;&lt;br /&gt;
 END//&lt;br /&gt;
 &lt;br /&gt;
 DELIMITER ;&lt;br /&gt;
 &lt;br /&gt;
 -- 呼び出し例&lt;br /&gt;
 CALL calc_total(100.50, 3, @result);&lt;br /&gt;
 SELECT @result;  -- 結果: 301.50&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
INOUTパラメータの使用例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DELIMITER //&lt;br /&gt;
 &lt;br /&gt;
 CREATE PROCEDURE double_value(INOUT num INT)&lt;br /&gt;
 BEGIN&lt;br /&gt;
    SET num = num * 2;&lt;br /&gt;
 END//&lt;br /&gt;
 &lt;br /&gt;
 DELIMITER ;&lt;br /&gt;
 &lt;br /&gt;
 -- 呼び出し例&lt;br /&gt;
 SET @value = 10;&lt;br /&gt;
 CALL double_value(@value);&lt;br /&gt;
 SELECT @value;  -- 結果: 20&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 変数の宣言と代入 ====&lt;br /&gt;
ストアドプロシージャ内では、&amp;lt;code&amp;gt;DECLARE&amp;lt;/code&amp;gt; 文で変数を宣言し、&amp;lt;code&amp;gt;SET&amp;lt;/code&amp;gt; 文や &amp;lt;code&amp;gt;SELECT INTO&amp;lt;/code&amp;gt; 文で値を代入できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
変数宣言の構文を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DECLARE &amp;lt;変数名&amp;gt; [, &amp;lt;変数名&amp;gt;] ... &amp;lt;データ型&amp;gt; [DEFAULT &amp;lt;デフォルト値&amp;gt;]&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
変数への代入には、以下の2つの方法がある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 SET &amp;lt;変数名&amp;gt; = &amp;lt;式&amp;gt; [, &amp;lt;変数名&amp;gt; = &amp;lt;式&amp;gt;] ...&lt;br /&gt;
 &lt;br /&gt;
 SELECT &amp;lt;列名&amp;gt; [, ...] INTO &amp;lt;変数名&amp;gt; [, ...] FROM &amp;lt;テーブル名&amp;gt; WHERE ...&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
使用例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DELIMITER //&lt;br /&gt;
 &lt;br /&gt;
 CREATE PROCEDURE variable_example()&lt;br /&gt;
 BEGIN&lt;br /&gt;
    DECLARE user_count INT DEFAULT 0;&lt;br /&gt;
    DECLARE max_price DECIMAL(10,2);&lt;br /&gt;
    DECLARE product_name VARCHAR(100);&lt;br /&gt;
 &lt;br /&gt;
    -- SET文による代入&lt;br /&gt;
    SET user_count = 100;&lt;br /&gt;
 &lt;br /&gt;
    -- SELECT INTO文による代入&lt;br /&gt;
    SELECT MAX(price), name&lt;br /&gt;
    INTO max_price, product_name&lt;br /&gt;
    FROM products&lt;br /&gt;
    WHERE price = (SELECT MAX(price) FROM products);&lt;br /&gt;
&lt;br /&gt;
    SELECT user_count, max_price, product_name;&lt;br /&gt;
 END//&lt;br /&gt;
 &lt;br /&gt;
 DELIMITER ;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
変数のスコープは、宣言されたBEGIN...ENDブロック内に限定される。&amp;lt;br&amp;gt;&lt;br /&gt;
変数は、宣言された順序で初期化される。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ストアドプロシージャの実行 ==&lt;br /&gt;
ストアドプロシージャを実行するには、&amp;lt;code&amp;gt;CALL&amp;lt;/code&amp;gt; 文を使用する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CALL &amp;lt;プロシージャ名&amp;gt;([&amp;lt;パラメータ&amp;gt;[, ...]]);&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* パラメータなしのプロシージャを呼び出す例&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CALL simple_proc();&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* INパラメータを持つプロシージャを呼び出す例&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CALL get_user_info(123);&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* OUT / INOUTパラメータを持つプロシージャを呼び出す場合は、ユーザ定義変数 (&amp;lt;code&amp;gt;@変数名&amp;lt;/code&amp;gt;) を使用する。&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CALL calc_total(100.50, 3, @result);&lt;br /&gt;
 SELECT @result;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* 複数のOUTパラメータを持つプロシージャの例&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DELIMITER //&lt;br /&gt;
 &lt;br /&gt;
 CREATE PROCEDURE get_user_stats(&lt;br /&gt;
    OUT total_users INT,&lt;br /&gt;
    OUT active_users INT,&lt;br /&gt;
    OUT inactive_users INT&lt;br /&gt;
 )&lt;br /&gt;
 BEGIN&lt;br /&gt;
    SELECT COUNT(*) INTO total_users FROM users;&lt;br /&gt;
    SELECT COUNT(*) INTO active_users FROM users WHERE status = &amp;#039;active&amp;#039;;&lt;br /&gt;
    SELECT COUNT(*) INTO inactive_users FROM users WHERE status = &amp;#039;inactive&amp;#039;;&lt;br /&gt;
 END//&lt;br /&gt;
 &lt;br /&gt;
 DELIMITER ;&lt;br /&gt;
 &lt;br /&gt;
 -- 呼び出し例&lt;br /&gt;
 CALL get_user_stats(@total, @active, @inactive);&lt;br /&gt;
 SELECT @total, @active, @inactive;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 制御フロー構文 ==&lt;br /&gt;
==== IF文 ====&lt;br /&gt;
IF文は、条件に応じて処理を分岐させる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 IF &amp;lt;条件式&amp;gt; THEN&lt;br /&gt;
    &amp;lt;処理&amp;gt;&lt;br /&gt;
 [ELSEIF &amp;lt;条件式&amp;gt; THEN&lt;br /&gt;
    &amp;lt;処理&amp;gt;] ...&lt;br /&gt;
 [ELSE&lt;br /&gt;
    &amp;lt;処理&amp;gt;]&lt;br /&gt;
 END IF&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
使用例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DELIMITER //&lt;br /&gt;
 &lt;br /&gt;
 CREATE PROCEDURE check_price(IN price DECIMAL(10,2), OUT category VARCHAR(20))&lt;br /&gt;
 BEGIN&lt;br /&gt;
    IF price &amp;lt; 100 THEN&lt;br /&gt;
       SET category = &amp;#039;安価&amp;#039;;&lt;br /&gt;
    ELSEIF price &amp;lt; 1000 THEN&lt;br /&gt;
       SET category = &amp;#039;中価格&amp;#039;;&lt;br /&gt;
    ELSE&lt;br /&gt;
       SET category = &amp;#039;高価&amp;#039;;&lt;br /&gt;
    END IF;&lt;br /&gt;
 END//&lt;br /&gt;
 &lt;br /&gt;
 DELIMITER ;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== CASE文 ====&lt;br /&gt;
CASE文には、単純CASEと検索CASEの2種類がある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
単純CASE文の構文を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CASE &amp;lt;判定値&amp;gt;&lt;br /&gt;
    WHEN &amp;lt;値&amp;gt; THEN &amp;lt;処理&amp;gt;&lt;br /&gt;
    [WHEN &amp;lt;値&amp;gt; THEN &amp;lt;処理&amp;gt;] ...&lt;br /&gt;
    [ELSE &amp;lt;処理&amp;gt;]&lt;br /&gt;
 END CASE&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
検索CASE文の構文を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CASE&lt;br /&gt;
    WHEN &amp;lt;条件式&amp;gt; THEN &amp;lt;処理&amp;gt;&lt;br /&gt;
    [WHEN &amp;lt;条件式&amp;gt; THEN &amp;lt;処理&amp;gt;] ...&lt;br /&gt;
    [ELSE &amp;lt;処理&amp;gt;]&lt;br /&gt;
 END CASE&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
単純CASE文の使用例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DELIMITER //&lt;br /&gt;
 &lt;br /&gt;
 CREATE PROCEDURE get_day_type(IN day_num INT, OUT day_type VARCHAR(20))&lt;br /&gt;
 BEGIN&lt;br /&gt;
    CASE day_num&lt;br /&gt;
       WHEN 1 THEN SET day_type = &amp;#039;月曜日&amp;#039;;&lt;br /&gt;
       WHEN 2 THEN SET day_type = &amp;#039;火曜日&amp;#039;;&lt;br /&gt;
       WHEN 3 THEN SET day_type = &amp;#039;水曜日&amp;#039;;&lt;br /&gt;
       WHEN 4 THEN SET day_type = &amp;#039;木曜日&amp;#039;;&lt;br /&gt;
       WHEN 5 THEN SET day_type = &amp;#039;金曜日&amp;#039;;&lt;br /&gt;
       WHEN 6 THEN SET day_type = &amp;#039;土曜日&amp;#039;;&lt;br /&gt;
       WHEN 7 THEN SET day_type = &amp;#039;日曜日&amp;#039;;&lt;br /&gt;
       ELSE SET day_type = &amp;#039;不明&amp;#039;;&lt;br /&gt;
    END CASE;&lt;br /&gt;
 END//&lt;br /&gt;
 &lt;br /&gt;
 DELIMITER ;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
検索CASE文の使用例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DELIMITER //&lt;br /&gt;
 &lt;br /&gt;
 CREATE PROCEDURE grade_score(IN score INT, OUT grade CHAR(1))&lt;br /&gt;
 BEGIN&lt;br /&gt;
    CASE&lt;br /&gt;
       WHEN score &amp;gt;= 90 THEN SET grade = &amp;#039;A&amp;#039;;&lt;br /&gt;
       WHEN score &amp;gt;= 80 THEN SET grade = &amp;#039;B&amp;#039;;&lt;br /&gt;
       WHEN score &amp;gt;= 70 THEN SET grade = &amp;#039;C&amp;#039;;&lt;br /&gt;
       WHEN score &amp;gt;= 60 THEN SET grade = &amp;#039;D&amp;#039;;&lt;br /&gt;
       ELSE SET grade = &amp;#039;F&amp;#039;;&lt;br /&gt;
    END CASE;&lt;br /&gt;
 END//&lt;br /&gt;
 &lt;br /&gt;
 DELIMITER ;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== LOOP文 ====&lt;br /&gt;
LOOP文は、無限ループを実装する。&amp;lt;br&amp;gt;&lt;br /&gt;
LEAVE文でループを抜け、ITERATE文でループの先頭に戻る。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 [&amp;lt;ラベル&amp;gt;:] LOOP&lt;br /&gt;
    &amp;lt;処理&amp;gt;&lt;br /&gt;
 END LOOP [&amp;lt;ラベル&amp;gt;]&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
使用例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DELIMITER //&lt;br /&gt;
 &lt;br /&gt;
 CREATE PROCEDURE loop_example()&lt;br /&gt;
 BEGIN&lt;br /&gt;
    DECLARE counter INT DEFAULT 0;&lt;br /&gt;
    DECLARE sum INT DEFAULT 0;&lt;br /&gt;
 &lt;br /&gt;
    my_loop: LOOP&lt;br /&gt;
       SET counter = counter + 1;&lt;br /&gt;
       SET sum = sum + counter;&lt;br /&gt;
 &lt;br /&gt;
       IF counter &amp;gt;= 10 THEN&lt;br /&gt;
          LEAVE my_loop;&lt;br /&gt;
       END IF;&lt;br /&gt;
    END LOOP my_loop;&lt;br /&gt;
 &lt;br /&gt;
    SELECT sum;  -- 結果: 55&lt;br /&gt;
 END//&lt;br /&gt;
 &lt;br /&gt;
 DELIMITER ;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
ITERATE文を使用した例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DELIMITER //&lt;br /&gt;
 &lt;br /&gt;
 CREATE PROCEDURE iterate_example()&lt;br /&gt;
 BEGIN&lt;br /&gt;
    DECLARE counter INT DEFAULT 0;&lt;br /&gt;
    DECLARE even_sum INT DEFAULT 0;&lt;br /&gt;
 &lt;br /&gt;
    my_loop: LOOP&lt;br /&gt;
       SET counter = counter + 1;&lt;br /&gt;
 &lt;br /&gt;
       IF counter &amp;gt; 10 THEN&lt;br /&gt;
          LEAVE my_loop;&lt;br /&gt;
       END IF;&lt;br /&gt;
 &lt;br /&gt;
       IF counter MOD 2 = 1 THEN&lt;br /&gt;
          ITERATE my_loop;  -- 奇数はスキップ&lt;br /&gt;
       END IF;&lt;br /&gt;
 &lt;br /&gt;
       SET even_sum = even_sum + counter;&lt;br /&gt;
    END LOOP my_loop;&lt;br /&gt;
 &lt;br /&gt;
    SELECT even_sum;  -- 結果: 30 (2+4+6+8+10)&lt;br /&gt;
 END//&lt;br /&gt;
 &lt;br /&gt;
 DELIMITER ;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== WHILE文 ====&lt;br /&gt;
WHILE文は、条件がTRUEの間、処理を繰り返す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 [&amp;lt;ラベル&amp;gt;:] WHILE &amp;lt;条件式&amp;gt; DO&lt;br /&gt;
    &amp;lt;処理&amp;gt;&lt;br /&gt;
 END WHILE [&amp;lt;ラベル&amp;gt;]&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
使用例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DELIMITER //&lt;br /&gt;
 &lt;br /&gt;
 CREATE PROCEDURE while_example()&lt;br /&gt;
 BEGIN&lt;br /&gt;
    DECLARE counter INT DEFAULT 1;&lt;br /&gt;
    DECLARE factorial INT DEFAULT 1;&lt;br /&gt;
 &lt;br /&gt;
    WHILE counter &amp;lt;= 5 DO&lt;br /&gt;
       SET factorial = factorial * counter;&lt;br /&gt;
       SET counter = counter + 1;&lt;br /&gt;
    END WHILE;&lt;br /&gt;
 &lt;br /&gt;
    SELECT factorial;  -- 結果: 120 (5の階乗)&lt;br /&gt;
 END//&lt;br /&gt;
 &lt;br /&gt;
 DELIMITER ;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== REPEAT文 ====&lt;br /&gt;
REPEAT文は、条件がTRUEになるまで処理を繰り返す。&amp;lt;br&amp;gt;&lt;br /&gt;
WHILE文とは異なり、最低1回は処理が実行される。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 [&amp;lt;ラベル&amp;gt;:] REPEAT&lt;br /&gt;
    &amp;lt;処理&amp;gt;&lt;br /&gt;
 UNTIL &amp;lt;条件式&amp;gt;&lt;br /&gt;
 END REPEAT [&amp;lt;ラベル&amp;gt;]&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
使用例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DELIMITER //&lt;br /&gt;
 &lt;br /&gt;
 CREATE PROCEDURE repeat_example()&lt;br /&gt;
 BEGIN&lt;br /&gt;
    DECLARE counter INT DEFAULT 1;&lt;br /&gt;
    DECLARE sum INT DEFAULT 0;&lt;br /&gt;
 &lt;br /&gt;
    REPEAT&lt;br /&gt;
       SET sum = sum + counter;&lt;br /&gt;
       SET counter = counter + 1;&lt;br /&gt;
    UNTIL counter &amp;gt; 10&lt;br /&gt;
    END REPEAT;&lt;br /&gt;
 &lt;br /&gt;
    SELECT sum;  -- 結果: 55&lt;br /&gt;
 END//&lt;br /&gt;
 &lt;br /&gt;
 DELIMITER ;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== カーソル ==&lt;br /&gt;
==== カーソルの基本 ====&lt;br /&gt;
カーソルは、SELECT文の結果セットを行単位で処理するための機能である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
カーソルの基本的な構文を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DECLARE &amp;lt;カーソル名&amp;gt; CURSOR FOR &amp;lt;SELECT文&amp;gt;;&lt;br /&gt;
 OPEN &amp;lt;カーソル名&amp;gt;;&lt;br /&gt;
 FETCH &amp;lt;カーソル名&amp;gt; INTO &amp;lt;変数名&amp;gt; [, &amp;lt;変数名&amp;gt;] ...;&lt;br /&gt;
 CLOSE &amp;lt;カーソル名&amp;gt;;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
カーソルの宣言は、変数宣言の後、ハンドラー宣言の前に行う必要がある。&amp;lt;br&amp;gt;&lt;br /&gt;
SELECT文にはINTO句を使用できない。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
基本的な使用例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DELIMITER //&lt;br /&gt;
 &lt;br /&gt;
 CREATE PROCEDURE cursor_example()&lt;br /&gt;
 BEGIN&lt;br /&gt;
    DECLARE done INT DEFAULT FALSE;&lt;br /&gt;
    DECLARE user_name VARCHAR(50);&lt;br /&gt;
    DECLARE user_email VARCHAR(100);&lt;br /&gt;
    DECLARE cur CURSOR FOR SELECT username, email FROM users;&lt;br /&gt;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;&lt;br /&gt;
 &lt;br /&gt;
    OPEN cur;&lt;br /&gt;
 &lt;br /&gt;
    read_loop: LOOP&lt;br /&gt;
       FETCH cur INTO user_name, user_email;&lt;br /&gt;
       IF done THEN&lt;br /&gt;
          LEAVE read_loop;&lt;br /&gt;
       END IF;&lt;br /&gt;
 &lt;br /&gt;
       -- 各行に対する処理&lt;br /&gt;
       SELECT user_name, user_email;&lt;br /&gt;
    END LOOP;&lt;br /&gt;
 &lt;br /&gt;
    CLOSE cur;&lt;br /&gt;
 END//&lt;br /&gt;
 &lt;br /&gt;
 DELIMITER ;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== カーソルと繰り返し処理 ====&lt;br /&gt;
カーソルは、&amp;lt;code&amp;gt;NOT FOUND&amp;lt;/code&amp;gt; ハンドラーと組み合わせて使用する。&amp;lt;br&amp;gt;&lt;br /&gt;
カーソルの終端に達すると、NOT FOUND条件が発生する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;カーソルは、使用後に必ず &amp;lt;code&amp;gt;CLOSE&amp;lt;/code&amp;gt; 文で閉じる必要がある。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
実用的な例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DELIMITER //&lt;br /&gt;
 &lt;br /&gt;
 CREATE PROCEDURE curdemo()&lt;br /&gt;
 BEGIN&lt;br /&gt;
    DECLARE done INT DEFAULT FALSE;&lt;br /&gt;
    DECLARE a CHAR(16);&lt;br /&gt;
    DECLARE b, c INT;&lt;br /&gt;
    DECLARE cur1 CURSOR FOR SELECT id, data FROM test.t1;&lt;br /&gt;
    DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;&lt;br /&gt;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;&lt;br /&gt;
 &lt;br /&gt;
    OPEN cur1;&lt;br /&gt;
    OPEN cur2;&lt;br /&gt;
 &lt;br /&gt;
    read_loop: LOOP&lt;br /&gt;
       FETCH cur1 INTO a, b;&lt;br /&gt;
       FETCH cur2 INTO c;&lt;br /&gt;
       IF done THEN&lt;br /&gt;
          LEAVE read_loop;&lt;br /&gt;
       END IF;&lt;br /&gt;
       IF b &amp;lt; c THEN&lt;br /&gt;
          INSERT INTO test.t3 VALUES (a, b);&lt;br /&gt;
       ELSE&lt;br /&gt;
          INSERT INTO test.t3 VALUES (a, c);&lt;br /&gt;
       END IF;&lt;br /&gt;
    END LOOP;&lt;br /&gt;
 &lt;br /&gt;
    CLOSE cur1;&lt;br /&gt;
    CLOSE cur2;&lt;br /&gt;
 END//&lt;br /&gt;
 &lt;br /&gt;
 DELIMITER ;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
複数のカーソルを同時に使用する場合は、上記の例のように個別に開閉する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ハンドラー ==&lt;br /&gt;
ハンドラーは、エラーや例外が発生した際の処理を定義する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DECLARE handler_action HANDLER&lt;br /&gt;
    FOR &amp;lt;条件値&amp;gt; [, &amp;lt;条件値&amp;gt;] ...&lt;br /&gt;
    statement;&lt;br /&gt;
 &lt;br /&gt;
 handler_action: { CONTINUE | EXIT | UNDO }&lt;br /&gt;
 &lt;br /&gt;
 condition_value: {&lt;br /&gt;
    mysql_error_code&lt;br /&gt;
  | SQLSTATE [VALUE] sqlstate_value&lt;br /&gt;
  | condition_name&lt;br /&gt;
  | SQLWARNING&lt;br /&gt;
  | NOT FOUND&lt;br /&gt;
  | SQLEXCEPTION&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ ハンドラーアクション&lt;br /&gt;
! アクション !! 説明&lt;br /&gt;
|-&lt;br /&gt;
| CONTINUE || ハンドラー実行後、処理を続行する&lt;br /&gt;
|-&lt;br /&gt;
| EXIT || ハンドラー実行後、現在のBEGIN...ENDブロックを終了する&lt;br /&gt;
|-&lt;br /&gt;
| UNDO || 未サポート&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 条件値&lt;br /&gt;
! 条件値 !! 説明&lt;br /&gt;
|-&lt;br /&gt;
| SQLWARNING || &amp;#039;01&amp;#039;で始まるSQLSTATEの短縮形&lt;br /&gt;
|-&lt;br /&gt;
| NOT FOUND || &amp;#039;02&amp;#039;で始まるSQLSTATEの短縮形 (カーソルの終端等)&lt;br /&gt;
|-&lt;br /&gt;
| SQLEXCEPTION || &amp;#039;00&amp;#039;, &amp;#039;01&amp;#039;, &amp;#039;02&amp;#039;以外のSQLSTATEの短縮形&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
使用例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DELIMITER //&lt;br /&gt;
 &lt;br /&gt;
 CREATE PROCEDURE handler_example()&lt;br /&gt;
 BEGIN&lt;br /&gt;
    DECLARE duplicate_key INT DEFAULT 0;&lt;br /&gt;
    DECLARE CONTINUE HANDLER FOR 1062&lt;br /&gt;
       SET duplicate_key = 1;&lt;br /&gt;
 &lt;br /&gt;
    INSERT INTO users (user_id, username) VALUES (1, &amp;#039;test&amp;#039;);&lt;br /&gt;
 &lt;br /&gt;
    IF duplicate_key = 1 THEN&lt;br /&gt;
       SELECT &amp;#039;Duplicate key error occurred&amp;#039;;&lt;br /&gt;
    ELSE&lt;br /&gt;
       SELECT &amp;#039;Insert successful&amp;#039;;&lt;br /&gt;
    END IF;&lt;br /&gt;
 END//&lt;br /&gt;
 &lt;br /&gt;
 DELIMITER ;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* SQLSTATE値を使用した例&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DELIMITER //&lt;br /&gt;
 &lt;br /&gt;
 CREATE PROCEDURE sqlstate_handler()&lt;br /&gt;
 BEGIN&lt;br /&gt;
    DECLARE CONTINUE HANDLER FOR SQLSTATE &amp;#039;23000&amp;#039;&lt;br /&gt;
       SELECT &amp;#039;Integrity constraint violation&amp;#039;;&lt;br /&gt;
 &lt;br /&gt;
    INSERT INTO orders (order_id, customer_id) VALUES (1, 999);&lt;br /&gt;
 END//&lt;br /&gt;
 &lt;br /&gt;
 DELIMITER ;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* 複数の条件を処理する例&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DELIMITER //&lt;br /&gt;
 &lt;br /&gt;
 CREATE PROCEDURE multi_handler()&lt;br /&gt;
 BEGIN&lt;br /&gt;
    DECLARE EXIT HANDLER FOR SQLEXCEPTION&lt;br /&gt;
    BEGIN&lt;br /&gt;
       ROLLBACK;&lt;br /&gt;
       SELECT &amp;#039;An error occurred, transaction rolled back&amp;#039;;&lt;br /&gt;
    END;&lt;br /&gt;
 &lt;br /&gt;
    DECLARE CONTINUE HANDLER FOR SQLWARNING&lt;br /&gt;
       SELECT &amp;#039;Warning occurred&amp;#039;;&lt;br /&gt;
 &lt;br /&gt;
    START TRANSACTION;&lt;br /&gt;
    -- SQL文&lt;br /&gt;
    COMMIT;&lt;br /&gt;
 END//&lt;br /&gt;
 &lt;br /&gt;
 DELIMITER ;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ストアドプロシージャの変更と削除 ==&lt;br /&gt;
ストアドプロシージャの本体 (routine_body) を変更する場合は、&amp;lt;code&amp;gt;DROP PROCEDURE&amp;lt;/code&amp;gt; と &amp;lt;code&amp;gt;CREATE PROCEDURE&amp;lt;/code&amp;gt; を組み合わせて再作成する必要がある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;&amp;lt;code&amp;gt;ALTER PROCEDURE&amp;lt;/code&amp;gt; 文は、プロシージャの特性 (characteristics) のみを変更できる。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;変更可能な特性は、COMMENT、LANGUAGE SQL、SQL SECURITY、その他のcharacteristicsである。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 ALTER PROCEDURE &amp;lt;プロシージャ名&amp;gt;&lt;br /&gt;
    [characteristic ...]&lt;br /&gt;
 &lt;br /&gt;
 characteristic: {&lt;br /&gt;
    COMMENT &amp;#039;string&amp;#039;&lt;br /&gt;
  | LANGUAGE SQL&lt;br /&gt;
  | SQL SECURITY { DEFINER | INVOKER }&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
使用例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DROP PROCEDURE IF EXISTS get_user_count;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
IF EXISTS句を指定すると、プロシージャが存在しない場合でもエラーにならず、警告のみが出力される。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* コメントを変更する例&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 ALTER PROCEDURE get_user_count&lt;br /&gt;
    COMMENT &amp;#039;全ユーザ数を取得するプロシージャ&amp;#039;;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* ストアドプロシージャを削除するには、&amp;lt;code&amp;gt;DROP PROCEDURE&amp;lt;/code&amp;gt;文を使用する。&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DROP PROCEDURE [IF EXISTS] &amp;lt;プロシージャ名&amp;gt;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ストアドプロシージャの確認 ==&lt;br /&gt;
ストアドプロシージャの定義を確認するには、&amp;lt;code&amp;gt;SHOW CREATE PROCEDURE&amp;lt;/code&amp;gt; 文を使用する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 SHOW CREATE PROCEDURE &amp;lt;プロシージャ名&amp;gt;;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
データベース内の全てのプロシージャ一覧を確認するには、&amp;lt;code&amp;gt;SHOW PROCEDURE STATUS&amp;lt;/code&amp;gt; 文を使用する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 SHOW PROCEDURE STATUS;&lt;br /&gt;
 &lt;br /&gt;
 -- 特定のデータベースのプロシージャのみを表示&lt;br /&gt;
 SHOW PROCEDURE STATUS WHERE Db = &amp;#039;database_name&amp;#039;;&lt;br /&gt;
 &lt;br /&gt;
 -- パターンマッチング&lt;br /&gt;
 SHOW PROCEDURE STATUS LIKE &amp;#039;get_%&amp;#039;;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;INFORMATION_SCHEMA.ROUTINES&amp;lt;/code&amp;gt; テーブルから詳細情報を取得することもできる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 SELECT ROUTINE_NAME, ROUTINE_TYPE, ROUTINE_DEFINITION&lt;br /&gt;
 FROM INFORMATION_SCHEMA.ROUTINES&lt;br /&gt;
 WHERE ROUTINE_SCHEMA = &amp;#039;&amp;lt;データベース名&amp;gt;&amp;#039;&lt;br /&gt;
   AND ROUTINE_TYPE = &amp;#039;PROCEDURE&amp;#039;;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
プロシージャのパラメータ情報を確認する場合は、&amp;lt;code&amp;gt;INFORMATION_SCHEMA.PARAMETERS&amp;lt;/code&amp;gt; テーブルを使用する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 SELECT PARAMETER_NAME, PARAMETER_MODE, DATA_TYPE&lt;br /&gt;
 FROM INFORMATION_SCHEMA.PARAMETERS&lt;br /&gt;
 WHERE SPECIFIC_SCHEMA = &amp;#039;&amp;lt;データベース名&amp;gt;&amp;#039;&lt;br /&gt;
   AND SPECIFIC_NAME = &amp;#039;&amp;lt;プロシージャ名&amp;gt;&amp;#039;&lt;br /&gt;
 ORDER BY ORDINAL_POSITION;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== トランザクション制御 ==&lt;br /&gt;
ストアドプロシージャ内で、トランザクション制御を行うことができる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 START TRANSACTION;&lt;br /&gt;
 -- SQL文&lt;br /&gt;
 COMMIT;&lt;br /&gt;
 -- または&lt;br /&gt;
 ROLLBACK;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
トランザクションを使用した例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DELIMITER //&lt;br /&gt;
 &lt;br /&gt;
 CREATE PROCEDURE transfer_money(&lt;br /&gt;
    IN from_account INT,&lt;br /&gt;
    IN to_account INT,&lt;br /&gt;
    IN amount DECIMAL(10,2)&lt;br /&gt;
 )&lt;br /&gt;
 BEGIN&lt;br /&gt;
    DECLARE EXIT HANDLER FOR SQLEXCEPTION&lt;br /&gt;
    BEGIN&lt;br /&gt;
       ROLLBACK;&lt;br /&gt;
       SELECT &amp;#039;Transaction failed, rolled back&amp;#039;;&lt;br /&gt;
    END;&lt;br /&gt;
 &lt;br /&gt;
    START TRANSACTION;&lt;br /&gt;
 &lt;br /&gt;
    UPDATE accounts SET balance = balance - amount WHERE account_id = from_account;&lt;br /&gt;
    UPDATE accounts SET balance = balance + amount WHERE account_id = to_account;&lt;br /&gt;
 &lt;br /&gt;
    COMMIT;&lt;br /&gt;
    SELECT &amp;#039;Transaction successful&amp;#039;;&lt;br /&gt;
 END//&lt;br /&gt;
 &lt;br /&gt;
 DELIMITER ;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
SAVEPOINTを使用した例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DELIMITER //&lt;br /&gt;
 &lt;br /&gt;
 CREATE PROCEDURE savepoint_example()&lt;br /&gt;
 BEGIN&lt;br /&gt;
    START TRANSACTION;&lt;br /&gt;
 &lt;br /&gt;
    INSERT INTO log_table (message) VALUES (&amp;#039;Start&amp;#039;);&lt;br /&gt;
 &lt;br /&gt;
    SAVEPOINT sp1;&lt;br /&gt;
 &lt;br /&gt;
    INSERT INTO log_table (message) VALUES (&amp;#039;Step 1&amp;#039;);&lt;br /&gt;
 &lt;br /&gt;
    SAVEPOINT sp2;&lt;br /&gt;
 &lt;br /&gt;
    INSERT INTO log_table (message) VALUES (&amp;#039;Step 2&amp;#039;);&lt;br /&gt;
 &lt;br /&gt;
    -- sp2までロールバック&lt;br /&gt;
    ROLLBACK TO SAVEPOINT sp2;&lt;br /&gt;
 &lt;br /&gt;
    COMMIT;&lt;br /&gt;
 END//&lt;br /&gt;
 &lt;br /&gt;
 DELIMITER ;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
ストアドプロシージャ内でトランザクションを使用する場合、エラーハンドラーと組み合わせることで、エラー時の自動ロールバックを実装できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ストアドファンクションとの違い ==&lt;br /&gt;
ストアドプロシージャとストアドファンクションの主な違いを以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ ストアドプロシージャとストアドファンクションの比較&lt;br /&gt;
! 項目 !! ストアドプロシージャ !! ストアドファンクション&lt;br /&gt;
|-&lt;br /&gt;
| 呼び出し方法 || &amp;lt;code&amp;gt;CALL&amp;lt;/code&amp;gt;文 || SELECT文内で使用&lt;br /&gt;
|-&lt;br /&gt;
| 戻り値 || OUT / INOUTパラメータで複数の値を返す || RETURN文で単一の値を返す&lt;br /&gt;
|-&lt;br /&gt;
| RETURNS句 || 不要 || 必須&lt;br /&gt;
|-&lt;br /&gt;
| パラメータ || IN / OUT / INOUT || INのみ&lt;br /&gt;
|-&lt;br /&gt;
| トランザクション制御 || 可能 || 制限あり (COMMIT / ROLLBACK不可)&lt;br /&gt;
|-&lt;br /&gt;
| DML文 || 使用可能 || 使用可能&lt;br /&gt;
|-&lt;br /&gt;
| 結果セットを返すSELECT文 || 使用可能 || 使用不可&lt;br /&gt;
|-&lt;br /&gt;
| DETERMINISTIC / NO SQL / READS SQL DATA || オプション || 必須 (いずれか1つ)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
ストアドファンクションの例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DELIMITER //&lt;br /&gt;
 &lt;br /&gt;
 CREATE FUNCTION calc_tax(price DECIMAL(10,2))&lt;br /&gt;
 RETURNS DECIMAL(10,2)&lt;br /&gt;
 DETERMINISTIC&lt;br /&gt;
 BEGIN&lt;br /&gt;
    RETURN price * 0.10;&lt;br /&gt;
 END//&lt;br /&gt;
 &lt;br /&gt;
 DELIMITER ;&lt;br /&gt;
 &lt;br /&gt;
 -- 使用例&lt;br /&gt;
 SELECT product_name, price, calc_tax(price) AS tax&lt;br /&gt;
 FROM products;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
ストアドファンクションは、DETERMINISTIC または NO SQL / READS SQL DATAの指定が必須である。&amp;lt;br&amp;gt;&lt;br /&gt;
これにより、MySQLはファンクションが決定的 (同じ入力に対して常に同じ出力を返す) かどうかを判断できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
ストアドプロシージャは、複雑な処理や複数の値を返す場合に適している。&amp;lt;br&amp;gt;&lt;br /&gt;
ストアドファンクションは、単一の計算結果を返し、SELECT文内で使用する場合に適している。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== サンプルクエリ ==&lt;br /&gt;
==== ページネーション処理 ====&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DELIMITER //&lt;br /&gt;
 &lt;br /&gt;
 CREATE PROCEDURE get_users_paginated(&lt;br /&gt;
    IN page_num INT,&lt;br /&gt;
    IN page_size INT,&lt;br /&gt;
    OUT total_count INT&lt;br /&gt;
 )&lt;br /&gt;
 BEGIN&lt;br /&gt;
    DECLARE offset_val INT;&lt;br /&gt;
 &lt;br /&gt;
    SET offset_val = (page_num - 1) * page_size;&lt;br /&gt;
 &lt;br /&gt;
    SELECT COUNT(*) INTO total_count FROM users;&lt;br /&gt;
 &lt;br /&gt;
    SELECT user_id, username, email, created_at&lt;br /&gt;
    FROM users&lt;br /&gt;
    ORDER BY user_id&lt;br /&gt;
    LIMIT page_size OFFSET offset_val;&lt;br /&gt;
 END//&lt;br /&gt;
 &lt;br /&gt;
 DELIMITER ;&lt;br /&gt;
 &lt;br /&gt;
 -- 呼び出し例: 2ページ目を取得 (1ページあたり10件)&lt;br /&gt;
 CALL get_users_paginated(2, 10, @total);&lt;br /&gt;
 SELECT @total AS total_users;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 条件付き集計処理 ====&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DELIMITER //&lt;br /&gt;
 &lt;br /&gt;
 CREATE PROCEDURE get_sales_summary(&lt;br /&gt;
    IN start_date DATE,&lt;br /&gt;
    IN end_date DATE&lt;br /&gt;
 )&lt;br /&gt;
 BEGIN&lt;br /&gt;
    SELECT&lt;br /&gt;
       COUNT(*) AS total_orders,&lt;br /&gt;
       SUM(total_amount) AS total_sales,&lt;br /&gt;
       AVG(total_amount) AS avg_order_value,&lt;br /&gt;
       MAX(total_amount) AS max_order_value,&lt;br /&gt;
       MIN(total_amount) AS min_order_value&lt;br /&gt;
    FROM orders&lt;br /&gt;
    WHERE order_date BETWEEN start_date AND end_date;&lt;br /&gt;
 &lt;br /&gt;
    SELECT&lt;br /&gt;
       product_id,&lt;br /&gt;
       SUM(quantity) AS total_quantity,&lt;br /&gt;
       SUM(quantity * unit_price) AS total_revenue&lt;br /&gt;
    FROM order_items oi&lt;br /&gt;
    JOIN orders o ON oi.order_id = o.order_id&lt;br /&gt;
    WHERE o.order_date BETWEEN start_date AND end_date&lt;br /&gt;
    GROUP BY product_id&lt;br /&gt;
    ORDER BY total_revenue DESC&lt;br /&gt;
    LIMIT 10;&lt;br /&gt;
 END//&lt;br /&gt;
 &lt;br /&gt;
 DELIMITER ;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== データ検証と挿入 ====&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DELIMITER //&lt;br /&gt;
 &lt;br /&gt;
 CREATE PROCEDURE insert_order(&lt;br /&gt;
    IN p_customer_id INT,&lt;br /&gt;
    IN p_product_id INT,&lt;br /&gt;
    IN p_quantity INT,&lt;br /&gt;
    OUT p_order_id INT,&lt;br /&gt;
    OUT p_status VARCHAR(50)&lt;br /&gt;
 )&lt;br /&gt;
 BEGIN&lt;br /&gt;
    DECLARE v_stock INT;&lt;br /&gt;
    DECLARE v_price DECIMAL(10,2);&lt;br /&gt;
    DECLARE v_total DECIMAL(10,2);&lt;br /&gt;
 &lt;br /&gt;
    DECLARE EXIT HANDLER FOR SQLEXCEPTION&lt;br /&gt;
    BEGIN&lt;br /&gt;
       ROLLBACK;&lt;br /&gt;
       SET p_status = &amp;#039;エラーが発生しました&amp;#039;;&lt;br /&gt;
       SET p_order_id = NULL;&lt;br /&gt;
    END;&lt;br /&gt;
 &lt;br /&gt;
    -- 在庫確認&lt;br /&gt;
    SELECT stock, price INTO v_stock, v_price&lt;br /&gt;
    FROM products&lt;br /&gt;
    WHERE product_id = p_product_id;&lt;br /&gt;
 &lt;br /&gt;
    IF v_stock &amp;lt; p_quantity THEN&lt;br /&gt;
       SET p_status = &amp;#039;在庫不足&amp;#039;;&lt;br /&gt;
       SET p_order_id = NULL;&lt;br /&gt;
    ELSE&lt;br /&gt;
       START TRANSACTION;&lt;br /&gt;
 &lt;br /&gt;
       SET v_total = v_price * p_quantity;&lt;br /&gt;
 &lt;br /&gt;
       INSERT INTO orders (customer_id, order_date, total_amount)&lt;br /&gt;
       VALUES (p_customer_id, NOW(), v_total);&lt;br /&gt;
 &lt;br /&gt;
       SET p_order_id = LAST_INSERT_ID();&lt;br /&gt;
 &lt;br /&gt;
       INSERT INTO order_items (order_id, product_id, quantity, unit_price)&lt;br /&gt;
       VALUES (p_order_id, p_product_id, p_quantity, v_price);&lt;br /&gt;
 &lt;br /&gt;
       UPDATE products&lt;br /&gt;
       SET stock = stock - p_quantity&lt;br /&gt;
       WHERE product_id = p_product_id;&lt;br /&gt;
 &lt;br /&gt;
       COMMIT;&lt;br /&gt;
       SET p_status = &amp;#039;注文が完了しました&amp;#039;;&lt;br /&gt;
    END IF;&lt;br /&gt;
 END//&lt;br /&gt;
 &lt;br /&gt;
 DELIMITER ;&lt;br /&gt;
 &lt;br /&gt;
 -- 呼び出し例&lt;br /&gt;
 CALL insert_order(123, 456, 5, @order_id, @status);&lt;br /&gt;
 SELECT @order_id, @status;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 関連ページ ==&lt;br /&gt;
* [[MySQL - トリガー]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#seo:&lt;br /&gt;
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki&lt;br /&gt;
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,MySQL,Stored Procedure,ストアドプロシージャ,CREATE PROCEDURE,DROP PROCEDURE,ALTER PROCEDURE,CALL,Database,データベース,SQL,パラメータ,IN,OUT,INOUT,制御フロー,IF,CASE,LOOP,WHILE,REPEAT,カーソル,CURSOR,ハンドラー,HANDLER,トランザクション,Stored Function,ストアドファンクション,電気回路,電子回路,基板,プリント基板&lt;br /&gt;
|description={{PAGENAME}} - MySQLのストアドプロシージャの作成、実行、制御フロー、カーソル、ハンドラー、トランザクション制御に関する総合ガイド | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux&lt;br /&gt;
|image=/resources/assets/MochiuLogo_Single_Blue.png&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;br /&gt;
[[カテゴリ:MySQL]]&lt;/div&gt;</summary>
		<author><name>Wiki</name></author>
	</entry>
</feed>