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で権限が拒否された場合の解決策の詳細な説明

推薦する

CSSのoutline-offsetプロパティを使用してプラス記号を実装する

次のような初期コードがあると仮定します。 <!DOCTYPE html> <htm...

Linux で cmake を使用して MySQL をコンパイルおよびインストールするための詳細なチュートリアル

1. cmakeをインストールする1. cmakeの圧縮パッケージを解凍する [root@mysql...

Docker を使用した war パッケージ プロジェクトのデプロイの実装

Docker で war をデプロイするには、コンテナを使用する必要があります。ここでは tomca...

MySQL でのサブクエリの基本的な使用法

目次1. サブクエリの定義2. サブクエリの分類1. スカラーサブクエリ: 2. MySQLサブクエ...

大きなオフセットによる MySQL 制限ページングが遅い理由と最適化ソリューション

MySQL では通常、limit を使用してページ上のページング機能を完了しますが、データ量が大きな...

Gearman + MySQL による永続化操作例

この記事では、gearman+mysql メソッドを使用して永続化操作を実装します。ご参考までに、詳...

MySQL は、あるテーブルのデータに基づいて別のテーブルの特定のフィールドを更新します (SQL ステートメント)

次のコードは、MySQL が 1 つのテーブルのデータに基づいて別のテーブルのいくつかのフィールドを...

IE6 で幅と高さがおかしいバグ

図に示すように: しかし、IE6で表示すると、right:1px:になります。 IE6 には、幅と高...

テーブルを作成するための HTML dl、dt、dd タグとテーブル作成テーブル

ウェブサイトの開発とメンテナンスのコストが削減されるだけでなく、コードもよりセマンティックになります...

JavaScript セレクター関数 querySelector および querySelectorAll

目次1. querySelectorは単一の要素を照会する1. ドキュメントインスタンスの呼び出し2...

HTML の類似タグと属性の違いの詳細な説明

【1】<i></i>タグと<em></em>タグ同じ...

nginx でネストされた if メソッドを実装する方法

Nginx はネストされた if ステートメントをサポートしておらず、if ステートメントでの論理判...

Web 開発 js 文字列連結プレースホルダーと conlose オブジェクト API の詳細な説明

目次プレースホルダーの置き換えコンソール印刷テーブル()ログ、情報、警告、エラーグループ()、グルー...

ウェブページのメモリ使用量とCPU使用量を削減する方法

一部の Web ページは大きく見えなくても開くのに非常に時間がかかる場合があります。一方、他の We...