複数の値を返す MySQL ストアド プロシージャ メソッドの例

複数の値を返す MySQL ストアド プロシージャ メソッドの例

この記事では、例を使用して、MySQL ストアド プロシージャで複数の値を返す方法について説明します。ご参考までに、詳細は以下の通りです。

MySQL ストアド関数は 1 つの値のみを返します。複数の値を返すストアド プロシージャを開発するには、INOUT または OUT パラメータを持つストアド プロシージャを使用する必要があります。まず、注文テーブルの構造を見てみましょう。

mysql> desc 注文;
+----------------+-------------+------+------+--------+-------+
| フィールド | タイプ | Null | キー | デフォルト | 追加 |
+----------------+-------------+------+------+--------+-------+
| 注文番号 | int(11) | NO | PRI | NULL | |
| orderDate | 日付 | NO | | NULL | |
| requiredDate | 日付 | NO | | NULL | |
| 出荷日 | 日付 | はい | | NULL | |
| ステータス | varchar(15) | NO | | NULL | |
| コメント | テキスト | はい | | NULL | |
| 顧客番号 | int(11) | NO | MUL | NULL | |
+----------------+-------------+------+------+--------+-------+
7行セット

次に、顧客番号を受け取り、出荷済み、キャンセル済み、解決済み、および異議申し立て済みの注文の合計数を返すストアド プロシージャを見てみましょう。

区切り文字 $$
プロシージャ get_order_by_cust( を作成する
 IN cust_no INT、
 OUT発送済みINT、
 OUTキャンセルINT、
 OUTはINTを解決しました。
 OUT 論争 INT)
始める
 -- 発送済み
 選択
      count(*) 出荷済み
    から
      注文
    どこ
      顧客番号 = cust_no
        AND ステータス = '発送済み';
 -- キャンセル
 選択
      count(*) INTO キャンセル
    から
      注文
    どこ
      顧客番号 = cust_no
        AND ステータス = 'キャンセル';
 -- 解決済み
 選択
      count(*) INTO 解決済み
    から
      注文
    どこ
      顧客番号 = cust_no
        AND ステータス = '解決済み';
 -- 議論の余地あり
 選択
      count(*) INTO 議論中
    から
      注文
    どこ
      顧客番号 = cust_no
        AND ステータス = '異議あり';
終わり

実際、ストアド プロシージャには、IN パラメータに加えて、shipped、cancelled、resolved、disputed の 4 つの追加 OUT パラメータも必要です。 ストアド プロシージャでは、count 関数を含む select ステートメントを使用して、注文ステータスに基づいて対応する注文の合計数を取得し、対応するパラメーターに割り当てます。上記の SQL によると、get_order_by_cust ストアド プロシージャを使用する場合、顧客番号と 4 つのユーザー定義変数を渡して出力値を取得できます。ストアド プロシージャを実行した後、SELECT ステートメントを使用して変数値を出力します。

+----------+------------+-----------+-----------+
| @発送済み | @キャンセル済み | @解決済み | @争議中 |
+----------+------------+-----------+-----------+
| 22 | 0 | 1 | 1 |
+----------+------------+-----------+-----------+
セット内の1行

実際のアプリケーションと組み合わせて、PHP プログラムから複数の値を返すストアド プロシージャを呼び出す方法を見てみましょう。

<?php
/**
 * 複数の値を返すストアドプロシージャを呼び出す
 * @param $顧客番号
 */
関数 call_sp($customerNumber)
{
  試す {
    $pdo = 新しい PDO ("mysql:host=localhost;dbname=yiibaidb", 'root', '123456');
    // ストアドプロシージャを実行する
    $sql = 'get_order_by_cust(:no,@shipped,@canceled,@resolved,@disputed) を呼び出します';
    $stmt = $pdo->prepare($sql);
    $stmt->bindParam(':no', $customerNumber, PDO::PARAM_INT);
    $stmt->execute();
    $stmt->カーソルを閉じる();
    // 2番目のクエリを実行してOUTパラメータから値を取得します
    $r = $pdo->query("SELECT @shipped,@canceled,@resolved,@disputed")
         -> フェッチ(PDO::FETCH_ASSOC);
    もし($r){
      printf('発送済み: %d、キャンセル済み: %d、解決済み: %d、異議申し立て済み: %d',
        $r['@発送済み'],
        $r['@キャンセル'],
        $r['@解決済み'],
        $r['@disputed']);
    }
  } (PDOException $pe) をキャッチします {
    die("エラーが発生しました:" . $pe->getMessage());
  }
}
コール_sp(141);

上記のコードでは、@ 記号の前のユーザー定義変数はデータベース接続に関連付けられているため、呼び出し間でアクセスできます。

さて、今回の共有はこれですべてです。

MySQL 関連のコンテンツに興味のある読者は、このサイトの次のトピックをチェックしてください: 「MySQL ストアド プロシージャ スキル」、「MySQL 共通関数の概要」、「MySQL ログ操作スキル」、「MySQL トランザクション操作スキルの概要」、および「MySQL データベース ロック関連スキルの概要」

この記事が皆様のMySQLデータベース設計に役立つことを願っています。

以下もご興味があるかもしれません:
  • MySQL CASE WHEN ステートメントの使用手順
  • MySQL の if 文と case 文の概要
  • MySQLのCASE WHEN文の使用例をいくつか紹介します。
  • MySQL で case when 文を使用して複数条件クエリを実装する方法
  • MySQL ストアド プロシージャで if ステートメントを使用する詳細な例
  • MySQLストアドプロシージャにおけるカーソル(DECLARE)の原理と使い方の詳細な説明
  • MySQL ストアド プロシージャでの変数の定義と割り当て
  • MySQL ストアド プロシージャ カーソル ループの使用の概要
  • MySql ストアド プロシージャと関数の詳細な説明
  • MySQL ストアド プロシージャで case ステートメントを使用する詳細な例

<<:  jsはフォーム検証機能を実装します

>>:  Nginx セッション損失問題の解決策

推薦する

Linux の一般的なコマンドとショートカット キーの紹介

目次1 システムの紹介2 システムショートカット3 一般的なシステムコマンド1 システムの紹介 1....

Docker+Jenkinsによる自動デプロイの実現方法

Code Cloud を使用して Git コード ストレージ ウェアハウスを構築するhttps://...

WEBAPP開発スキルのまとめ(モバイルWebサイト開発の注意点)

1. レスポンシブな Web を開発するには、ページを画面サイズに適応させる必要があります。前の記...

MySQL スケジュールタスク例チュートリアル

序文MySQL 5.1.6 以降、非常にユニークな機能であるイベント スケジューラが追加されました。...

一般的な Dockerfile コマンドの使用方法の紹介

目次01 CM 02 エントリーポイント03 ワークディレクトリ04 環境05 ユーザー06巻07 ...

MySQLデータベースの操作とメンテナンスのデータ復旧方法

これまでの 3 つの記事では、論理バックアップと物理バックアップを含む、MySQL データベースの一...

カルーセルアニメーションを実現するVueコンポーネント

この記事では、カルーセルアニメーションを実現するためのVueコンポーネントの具体的なコードを例として...

MySql 8.0.16-win64 インストール チュートリアル

1. ダウンロードしたファイルを以下のように解凍します。 。 2. 環境変数に解凍ディレクトリを追加...

MySQL エラー「すべての派生テーブルには独自のエイリアスが必要です」の解決方法

MySQL は、マルチテーブルクエリを実行するときにエラーを報告します。 [SQL] SELECT ...

Linux のファイル権限とグループ変更コマンドの詳細な説明

Linux では、すべてがファイルであり (ディレクトリもファイルです)、各ファイルにはユーザーに対...

CSS コンテンツ属性を使用して、マウスホバープロンプト (ツールチップ) 効果を実現します。

なぜこのような効果を実現するのでしょうか。実は、この効果もタイトルプロンプトから派生したものですが、...

JavaScript のクロージャの問題の詳細な説明

クロージャは、純粋関数型プログラミング言語の伝統的な機能の 1 つです。クロージャをコア言語構造の不...

VMware での Ubuntu 16.04 イメージの完全インストール チュートリアル

この記事では、VMware 12でのUbuntu 16.04イメージのインストールチュートリアルを参...

ボリュームを使用してホストと Docker コンテナ間でファイルを転送する方法

以前、Docker コンテナとローカル マシン間のファイル転送に関する記事を書きました。しかし、この...

JavaScript の矢印関数と通常の関数の違いの詳細な説明

この記事では、JavaScriptにおけるアロー関数と通常の関数の違いについて解説します。具体的な内...