複数の値を返す 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 セッション損失問題の解決策

推薦する

VueはWebSocketを使用してチャット機能をシミュレートします

この効果は、2つのブラウザが互いにシミュレートしていることを示しています 1. シミュレートされたノ...

Vue は左右のスライド効果のサンプルコードを実装します

序文個人の実際の開発で使用した効果問題を、今後の開発やレビューに役立てるためにまとめています。他の人...

CentOS 7にDockerをインストールする

Linuxシステムをお持ちでない場合は、ダウンロードとインストールについてはhttps://www....

フロントエンドJavaScript ES6の詳細について

目次1. はじめに1.1 Babel トランスコーダ1.2 ポリフィル2. let と const ...

Apache Flink の任意の Jar パッケージのアップロードにより、リモート コード実行の脆弱性が再発する問題が発生する (脆弱性警告)

脆弱性の説明Apache Flink は、分散ストリームおよびバッチ データ処理用のオープン ソース...

JavaScript配列の重複排除のいくつかの方法についての詳細な説明

目次1.重複排除を設定する2. 重複を削除するには、2 回の for ループを使用します。 3. i...

MySQL 5.7.17 winx64 のインストールと設定のチュートリアル

今日、MySQL データベースをコンピューターに再度インストールしました。システムを再インストールす...

MySQLクエリ条件の一般的な使用法の詳細な説明

この記事では、例を使用して、MySQL クエリ条件の一般的な使用方法を説明します。ご参考までに、詳細...

HTMLコードに基づく画像断片化読み込み機能の実装

今日は断片化された画像の読み込み効果を実装します。効果は次のとおりです。 これを 3 つのステップで...

Vueは単純なランダムロールコールを実行します

目次レイアウト部分: <div id="アプリ"> <p>...

DockerにTomcat8をインストールする方法

1. dockerでtomcat8をインストールする1. Docker HubでTomcatイメージ...

Mysql5.7.18 のインストールとマスタースレーブレプリケーションの詳細なグラフィック説明

CentOS6.7にmysql5.7.18をインストールする 1. /usr/localディレクトリ...

Js でオブジェクトのディープ オブジェクトを安全に取得するメソッドの例

目次序文文章パラメータ例Lodash 実装:トーキー機能: castPath関数: stringTo...

JavaScript 高度なカスタム例外

目次1. コンセプト1.1 エラーと例外とは何ですか? 1.2 異常の分類2. 例外処理2.1try...

ウェブページ印刷細線表+ページ印刷究極の戦略

最近、クライアントのために印刷していたとき、ページのヘッダーを印刷するのではなく、表の内容だけを印刷...