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 のストアド プロシージャ、カーソル、トランザクションについての説明です。ご質問がある場合は、メッセージを残すか、このサイトのコミュニティで議論してください。お読みいただきありがとうございます。お役に立てれば幸いです。このサイトをサポートしていただき、ありがとうございます。 以下もご興味があるかもしれません:
|
<<: タブ切り替え機能を実装するJavaScriptカスタムプラグイン
>>: Linuxで権限が拒否された場合の解決策の詳細な説明
次のような初期コードがあると仮定します。 <!DOCTYPE html> <htm...
1. cmakeをインストールする1. cmakeの圧縮パッケージを解凍する [root@mysql...
Docker で war をデプロイするには、コンテナを使用する必要があります。ここでは tomca...
目次1. サブクエリの定義2. サブクエリの分類1. スカラーサブクエリ: 2. MySQLサブクエ...
MySQL では通常、limit を使用してページ上のページング機能を完了しますが、データ量が大きな...
この記事では、gearman+mysql メソッドを使用して永続化操作を実装します。ご参考までに、詳...
次のコードは、MySQL が 1 つのテーブルのデータに基づいて別のテーブルのいくつかのフィールドを...
図に示すように: しかし、IE6で表示すると、right:1px:になります。 IE6 には、幅と高...
ウェブサイトの開発とメンテナンスのコストが削減されるだけでなく、コードもよりセマンティックになります...
実際、これは非常に簡単です。imgにaタグを追加し、 <a href='tencent...
目次1. querySelectorは単一の要素を照会する1. ドキュメントインスタンスの呼び出し2...
【1】<i></i>タグと<em></em>タグ同じ...
Nginx はネストされた if ステートメントをサポートしておらず、if ステートメントでの論理判...
目次プレースホルダーの置き換えコンソール印刷テーブル()ログ、情報、警告、エラーグループ()、グルー...
一部の Web ページは大きく見えなくても開くのに非常に時間がかかる場合があります。一方、他の We...