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 スティッキーフッターのいくつかの実装

「スティッキーフッター」とはいわゆる「スティッキー フッター」は、新しいフロントエンドの概念や技術で...

CSSレイアウトで中央揃えレイアウトを実現する方法

1. 親コンテナーをテーブルに設定し、子をインライン要素に設定します。テキストを表示するサブコンテン...

Promiseの紹介と基本的な使い方の簡単な分析

Promise は、ES6 で導入された非同期プログラミングのための新しいソリューションです。 Pr...

vue $http の get および post リクエストのクロスドメイン問題を解決する

Vue $http get および post リクエストのクロスドメイン問題まずconfig/ind...

Vue の element-ui コンポーネントのデフォルトの CSS スタイルを変更する 4 つの方法

目次序文1. グローバル統合オーバーライドを使用する2. .vueファイルを変更する3. コンポーネ...

Docker が PostgreSQL を起動するときに複数のデータベースを作成するためのソリューション

1 はじめに「DockerでPostgreSQLを起動する方法といくつかの接続ツールのおすすめ」の記...

Linux で Redis のリモート接続を実装する方法

LinuxにRedisをインストールしたら、Javaを使って接続します。Javaコードは次のとおりで...

複数の Tomcat を展開して起動し、プロジェクトを移行する方法を 1 つの記事で学習します。

目次tomcatをデプロイする1.ダウンロードして解凍する2. 設定ファイルを変更する移植プロジェク...

docker での psql データベースのバックアップとリカバリの詳細な説明

1. DockerでのPostgresデータベースのバックアップ注文: docker exec it...

Windows に MySQL 8.0.16 をインストールする手順とエラーの解決方法

1. はじめに: mysql8以降は、これまでよく使われていたバージョンと比べてかなり変更点が大きい...

完全バックアップとポイントインタイムバックアップにmysqldumpを使用する方法

Mysqldump は MySQL の論理バックアップに使用されます。高速ではありませんが、柔軟性が...

MySQL の異なるテーブル間でフィールドをコピーする

場合によっては、フィールドから別の新しいフィールドにデータの列全体をコピーする必要があります。これは...

CentOS 7.3 で Nginx 仮想ホストを設定する方法

実験環境最小限にインストールされた CentOS 7.3 仮想マシン基本環境を構成する1. ngin...

スペース均等互換性の問題を解決する2つの方法についての簡単な説明

flex は 2009 年のリリース以来、ほぼすべてのブラウザでサポートされています。シンプルでレス...

MySQL の起動オプションとシステム変数の例の詳細な説明

目次ブートオプションコマンドラインパラメータの長い形式と短い形式設定ファイル構成グループシステム変数...