MySQL ストアド プロシージャ、カーソル、トランザクションの例の詳細な説明

MySQL ストアド プロシージャ、カーソル、トランザクションの例の詳細な説明

MySQL ストアド プロシージャ、カーソル、トランザクションの例の詳細な説明

以下は私が作成した MySQL データベース ストアド プロシージャです。アーカイブ用に保管し、将来の参照に使用します。

その中には、ストアド プロシージャ、カーソル (二重ループ)、トランザクションが含まれます。

[注意]: コード内のコメントは現在の業務のみに関するものであり、無視できます。

コードは次のとおりです。

区切り文字 $$
存在する場合はプロシージャを削除してください `transferEmailTempData`$$

CREATE PROCEDURE transferEmailTempData(IN jobId VARCHAR(24))
始める
  idval VARCHAR(24) DEFAULT '' を宣言します。
  taskIdval VARCHAR(24) DEFAULT '' を宣言します。
  groupIdval VARCHAR(24) DEFAULT '' を宣言します。
  emailval VARCHAR(50) DEFAULT '' を宣言します。
  
  /* 正式なテーブルに同一のデータがあるかどうか、つまり、groupId と email が同じかどうかを確認します */
  infoId VARCHAR(24) DEFAULT '' を宣言します。
  
  /*トランザクションエラー*/
  err INT DEFAULT 0 を宣言します。
  
  /*特定の数に達したら送信、カウンター*/
  DECLARE counts INT DEFAULT 0;
  
  /*ロールバックされたかどうかを識別する*/
  isrollback INT DEFAULT 0 を宣言します。
  
  /*カーソルが移動しているとき、すべてのレコードが移動されたかどうかを判断するためのマークとして使用されます*/
  done INTEGER DEFAULT 0 を宣言します。
  
  /*一時テーブル内のタスクのデータを取得します*/
  DECLARE cur CURSOR FOR SELECT id,taskId,groupId,email FROM `t_email_data_temp` WHERE taskId=jobId;
  
  /*グループ ID とメールに基づいて同一のレコードがあるかどうかを照会します*/
  DECLARE cur2 CURSOR FOR SELECT id FROM `t_email_info` e WHERE e.`group_id` = groupIdval AND e.`email_address` = emailval; 
  
  /* エラーが発生すると 1 に設定され、例外が発生する限りロールバックされます */
  SQLEXCEPTION SET err=1 の CONTINUE ハンドラーを宣言します。
  
  /*カーソルがすべてのレコードをトラバースするときに、フラグ変数が特定の値に設定されることを宣言します*/
  見つからない場合の継続ハンドラを宣言する
  完了=1を設定します。
  
  /*トランザクションを開始*/
  トランザクションを開始します。
  
  /*カーソルを開く*/
  オープンcur;
  
  /*ループするにはLOOPを使用します*/
  ループ
  
    /*各結果に対応するフィールド値を変数に代入します*/
    cur を idval、taskIdval、groupIdval、emailval に FETCH します。
    完了 = 1 の場合
      out_loopを終了します。
    終了の場合;
    
    /*2番目のカーソルを開く*/
    オープンcur2;
      SET 完了 = 0;
      cur2 を infoId にフェッチします。
      
      /*公式テーブルに同じグループ ID とメール レコードがない場合は、公式テーブルに追加します*/
      完了 = 1 の場合
      
        /*正式なテーブルに挿入*/
        `t_email_info` に VALUES(idval,emailval,groupIdval,0,'',NOW(),'admin',NOW(),'admin') を挿入します。
        
        /*一時データを削除*/
        id = idval; の場合、`t_email_data_temp` から削除します。
        
        /*カウンター、1000 項目ごとに送信*/
        SET カウント = カウント + 1;
        
        /*例外が発生しました。ロールバック*/
        エラー=1の場合
          isrollback=1 を設定します。
          ロールバック;
        それ以外
          カウントが1000の場合
            専念;
            /* 1000 件の送信に達したら、カウンターをリセットします */
            counts=0 に設定します。
          終了の場合;
        終了の場合;
      それ以外
        /*同じレコードがすでに存在する場合は削除します*/
        完了=0の場合
          id = idval; の場合、`t_email_data_temp` から削除します。
        終了の場合;
      終了の場合;
      cur2 を infoId にフェッチします。
    cur2 を閉じます。
    
    /*外部ループを制御します。このステップは省略できません。省略すると、1 回のループで終了します*/
    完了=0に設定します。
    
  ループ終了 out_loop;
  閉じるcur;
  
  /*ロールバックイベントが発生していない場合は、タスクステータスを更新します*/
  /*タスクがロールバックされ、タスクステータスが更新されない場合、残りのコミットされていないデータは、次回タスクが実行されたときに正式なテーブルに再度追加されます*/
  isrollback=0の場合
    `t_email_task` t を更新し、t.`if_finish` = 1 を設定します。WHERE t.`id`=jobId;
  終了の場合;
  
  終わり$$

区切り文字 ;

上記は、MySQL のストアド プロシージャ、カーソル、トランザクションについての説明です。ご質問がある場合は、メッセージを残すか、このサイトのコミュニティで議論してください。お読みいただきありがとうございます。お役に立てれば幸いです。このサイトをサポートしていただき、ありがとうございます。

以下もご興味があるかもしれません:
  • MySQL ストアド プロシージャ カーソル ループの使用の概要
  • MySQL ストアド プロシージャでカーソル ループを終了して継続する例
  • カーソルを使用したMySQLストアドプロシージャネストループのサンプルコード
  • MySQL ストアド プロシージャでカーソルを使用する例
  • MySQL 動的カーソル学習 (MySQL ストアド プロシージャ カーソル)
  • MySQLストアドプロシージャにおけるカーソル(DECLARE)の原理と使い方の詳細な説明
  • Mysql ストアド プロシージャでカーソルを使用する例
  • カーソル ループを使用して、MySQL ストアド プロシージャで一時テーブルを読み取る
  • MySql ストアド プロシージャとカーソルの使用例

<<:  タブ切り替え機能を実装するJavaScriptカスタムプラグイン

>>:  Linuxで権限が拒否された場合の解決策の詳細な説明

推薦する

WIN10 システムと Docker 内部コンテナ IP 間の通信方法

1. Windows 版の Docker をインストールしたら、Docker クイックスタート ター...

nginx で正規表現を使用してワイルドカードドメイン名を自動的に一致させる方法

Nginxは正規表現を使用して、ワイルドカードドメイン名をディレクトリに自動的に一致させます。 Ng...

MySQL 8.0.11 圧縮版のインストールと設定方法のグラフィックチュートリアル

MySQL 8.0圧縮パッケージのインストール方法、詳細は次のとおりです知らせ:オペレーティング シ...

MySQLの使用中に発生した問題

ここでは、MySQL の使用中に発生するいくつかの問題とその解決策を示します。 sql_mode=o...

Vue の動的メニュー、動的ルートの読み込みと更新の落とし穴

目次必要:アイデア:レッスン:テキストを共有する:要約する必要:インターフェイスからサブメニュー デ...

MySQLとOracleの誤解の詳細な説明

目次本質的な違いデータベースセキュリティ権限スキーマの移行パターンオブジェクトの類似性スキーマオブジ...

Mybatis での動的 SQL ステートメント分析

この記事は主にMybatisでの動的SQL文の解析について紹介します。この記事のサンプルコードは非常...

MySQL 起動失敗の問題とシナリオ分析

1. ワンストップソリューション1. 問題の分析と特定 # MySQL設定ファイルを見つけて、MyS...

MySQL 構成マスタースレーブサーバー (マスター 1 台とスレーブ複数台)

目次アイデアホスト構成confを変更する再起動テストスレーブ 1 の構成スレーブ2の構成マスターとス...

Alibaba Cloud ECS サーバーの開始プロセス (初心者必読のチュートリアル)

1. Alibaba Cloudは、個人のニーズに応じて適切なクラウドサーバーを選択し、CPU、メ...

React Nativeはモニタリングジェスチャーの上下プル効果を実現します

React Native は、プルアップとプルダウンの監視ジェスチャを実装します。詳細なコアコードは...

Vue2.x および Vue3.x のカスタム命令の使用方法とフック関数の原理を理解する

目次Vue2.x の使用法グローバル登録部分登録使用フック機能フック関数のパラメータVue3.x の...

Redis を Docker コンテナとして素早くデプロイする方法

目次はじめるデータストレージサーバーを構成するRedis セキュリティの管理Redisインストールの...

純粋なCSSで立体的な画像配置効果を実現するサンプルコード

1. 要素の幅/高さ/パディング/マージンのパーセンテージ基準要素の幅/高さ/パディング/マージンの...