MySQLのストアドプロシージャ動的テーブル名

今日のストアドプロシージャを記述する場合は、問題は、あなたがカーソルに関連していない場合は、使用は、あなたが欠場準備する必要があり、カーソルでダイナミックなテーブル名を使用するように、しかし、問題は解決することができる準備をテーブルにほとんどのパラメータをしたいです。

知恵のすべてを設定し、最終的には、問題を解決するために一時テーブルを使用します。

SELECTコマンド内のカーソルの定義に使用されるプロセス・パラメータへのMySQLのストアドプロシージャを実装する方法をテーブル名として引用

まずは、説明しましょうどのような場面、たとえば以下の(もちろん、正常に実行されていません)。

  1.  
  2. CREATE PROCEDURE `proc`(SourceDBName CHAR(50)、SourceTableName CHAR(50)、
  3. TargetDBName CHAR(50)、TargetTemplateTableName CHAR(50))
  4. ベギン
  5. DECLARE行わINTのDEFAULT 0;
  6. DECLAREたFieldValue CHAR(50)。
  7. DECLARE CursorSegment CURSOR FOR SELECT ... SourceDBName.SourceTableName FROM。
  8. DECLAREはCONTINUE HANDLER FOR NOT FOUND =行なわSET 1。
  9.  
  10. OPEN CursorSegment;
  11. 繰り返す
  12. CursorSegment INTOたFieldValueのFETCH。
  13. IF THEN行われていません
  14. ...
  15. END IF;
  16. 完了UNTIL ENDのREPEAT;
  17. CLOSE CursorSegment;
  18. END $$

上記のパラメータの例は、SELECTに転送カーソル定義データベースのストアド・プロシージャとテーブル名の内部に、転送する手順の試みを格納されています。しかし、実行時のMySQLの時にこのストアドプロシージャは存在しません「SourceDBName.SourceTableName」を促すメッセージが表示されます。それは解決するには、ローカル変数としてではなく、テーブルへの直接参照としてではないSourceDBNameとMySQL SourceTableName 2つの識別子ます。

この問題を解決するために、唯一の方法は、上記のプロセスは、3つのストアドプロシージャに分割されて記憶することです。はい、3。これは、より複雑なソリューションです。

最初のストアドプロシージャ、データコレクタの役割を果たしています。これは、一時テーブルに渡されたパラメータのデータベースやテーブル名、およびSELECTデータを受け取ります。最大の利点は、それが一時テーブルのスレッドセーフであることで、注意すべきです。

第1の一時テーブルのストアドプロシージャに基づいて第2の格納手順は、作成されたカーソルを生成し、特定の作業を処理します。

第三の記憶手順は、エントリとして、順番に、ストアドプロシージャ1及び2のストアドプロシージャを呼び出すための責任であり、適切なパラメータを提供します。

三のストアドプロシージャ一緒に、我々は次の例を取得します:

  1.  
  2. CREATE PROCEDURE `proc1`(SourceDBName CHAR(50)、SourceTableName CHAR(50))
  3. ベギン
  4. DECLAREたSQLStmtのTEXT;
  5.  
  6. SET SQL_NOTES = 0。
  7.  
  8. SET @SQLStmt = CONCAT('DROP TEMPORARY TABLE IFはtmp_table_nameをEXISTS')。
  9. stmtをPREPARE @SQLStmt FROM。
  10. stmtをEXECUTE。
  11. DEALLOCATE のstmtを準備します。
  12.  
  13. SET @SQLStmt = CONCAT('CREATE TEMPORARY TABLE tmp_table_name SELECT ... FROM'
  14. SourceDBName、 、SourceTableName、 ' ' ' ...');
  15. stmtをPREPARE @SQLStmt FROM。
  16. stmtをEXECUTE。
  17. DEALLOCATE のstmtを準備します。
  18. END $$
  19.  
  20. CREATE PROCEDURE `proc2`(TargetDBName CHAR(50)、TargetTemplateTableName CHAR(50))
  21. ベギン
  22. DECLARE行わINTのDEFAULT 0;
  23. DECLAREたFieldValue CHAR(50)。
  24. DECLARE CursorSegment CURSOR FOR SELECT 期間tmp_table_name FROM。
  25. DECLAREはCONTINUE HANDLER FOR NOT FOUND =行なわSET 1。
  26.  
  27. OPEN CursorSegment;
  28. 繰り返す
  29. CursorSegment INTOたFieldValueのFETCH。
  30. IF THEN行われていません
  31. ...
  32. END IF;
  33. 完了UNTIL ENDのREPEAT;
  34. CLOSE CursorSegment;
  35. END $$
  36.  
  37. CREATE PROCEDURE `proc3`(SourceDBName CHAR(50)、SourceTableName CHAR(50)、
  38. TargetDBName CHAR(50)、TargetTemplateTableName CHAR(50))
  39. ベギン
  40. CALLのPROC1(SourceDBName、SourceTableName)。
  41. CALLのPROC2(TargetDBName、TargetTemplateTableName)。
  42. END $$
  43.  

注:実行する前に、システム・パラメータは、変数「sql_notes」である必要は0に設定されている、または時間のDROP TABLEのPROC1は停止します。その理由は、

  1.  
  2. 「SQL_NOTES = {0 | 1}
  3. 1(デフォルト)に設定されている場合、注意レベルの警告が記録されています。
  4. 0に設定すると、ノートの警告が抑制されています。」


おすすめ

転載: www.cnblogs.com/zhuyeshen/p/12080406.html