今日のストアドプロシージャを記述する場合は、問題は、あなたがカーソルに関連していない場合は、使用は、あなたが欠場準備する必要があり、カーソルでダイナミックなテーブル名を使用するように、しかし、問題は解決することができる準備をテーブルにほとんどのパラメータをしたいです。
知恵のすべてを設定し、最終的には、問題を解決するために一時テーブルを使用します。
SELECTコマンド内のカーソルの定義に使用されるプロセス・パラメータへのMySQLのストアドプロシージャを実装する方法をテーブル名として引用
まずは、説明しましょうどのような場面、たとえば以下の(もちろん、正常に実行されていません)。
-
-
CREATE PROCEDURE `proc`(SourceDBName CHAR(50)、SourceTableName CHAR(50)、
-
TargetDBName CHAR(50)、TargetTemplateTableName CHAR(50))
-
ベギン
-
DECLARE行わINTのDEFAULT 0;
-
DECLAREたFieldValue CHAR(50)。
-
DECLARE CursorSegment CURSOR FOR SELECT ... SourceDBName.SourceTableName FROM。
-
DECLAREはCONTINUE HANDLER FOR NOT FOUND =行なわSET 1。
-
-
OPEN CursorSegment;
-
繰り返す
-
CursorSegment INTOたFieldValueのFETCH。
-
IF THEN行われていません
-
...
-
END IF;
-
完了UNTIL ENDのREPEAT;
-
CLOSE CursorSegment;
-
END $$
上記のパラメータの例は、SELECTに転送カーソル定義データベースのストアド・プロシージャとテーブル名の内部に、転送する手順の試みを格納されています。しかし、実行時のMySQLの時にこのストアドプロシージャは存在しません「SourceDBName.SourceTableName」を促すメッセージが表示されます。それは解決するには、ローカル変数としてではなく、テーブルへの直接参照としてではないSourceDBNameとMySQL SourceTableName 2つの識別子ます。
この問題を解決するために、唯一の方法は、上記のプロセスは、3つのストアドプロシージャに分割されて記憶することです。はい、3。これは、より複雑なソリューションです。
最初のストアドプロシージャ、データコレクタの役割を果たしています。これは、一時テーブルに渡されたパラメータのデータベースやテーブル名、およびSELECTデータを受け取ります。最大の利点は、それが一時テーブルのスレッドセーフであることで、注意すべきです。
第1の一時テーブルのストアドプロシージャに基づいて第2の格納手順は、作成されたカーソルを生成し、特定の作業を処理します。
第三の記憶手順は、エントリとして、順番に、ストアドプロシージャ1及び2のストアドプロシージャを呼び出すための責任であり、適切なパラメータを提供します。
三のストアドプロシージャ一緒に、我々は次の例を取得します:
-
-
CREATE PROCEDURE `proc1`(SourceDBName CHAR(50)、SourceTableName CHAR(50))
-
ベギン
-
DECLAREたSQLStmtのTEXT;
-
-
SET SQL_NOTES = 0。
-
-
SET @SQLStmt = CONCAT('DROP TEMPORARY TABLE IFはtmp_table_nameをEXISTS')。
-
stmtをPREPARE @SQLStmt FROM。
-
stmtをEXECUTE。
-
DEALLOCATE のstmtを準備します。
-
-
SET @SQLStmt = CONCAT('CREATE TEMPORARY TABLE tmp_table_name SELECT ... FROM'
-
SourceDBName、 、SourceTableName、 ' ' ' ...');
-
stmtをPREPARE @SQLStmt FROM。
-
stmtをEXECUTE。
-
DEALLOCATE のstmtを準備します。
-
END $$
-
-
CREATE PROCEDURE `proc2`(TargetDBName CHAR(50)、TargetTemplateTableName CHAR(50))
-
ベギン
-
DECLARE行わINTのDEFAULT 0;
-
DECLAREたFieldValue CHAR(50)。
-
DECLARE CursorSegment CURSOR FOR SELECT 期間tmp_table_name FROM。
-
DECLAREはCONTINUE HANDLER FOR NOT FOUND =行なわSET 1。
-
-
OPEN CursorSegment;
-
繰り返す
-
CursorSegment INTOたFieldValueのFETCH。
-
IF THEN行われていません
-
...
-
END IF;
-
完了UNTIL ENDのREPEAT;
-
CLOSE CursorSegment;
-
END $$
-
-
CREATE PROCEDURE `proc3`(SourceDBName CHAR(50)、SourceTableName CHAR(50)、
-
TargetDBName CHAR(50)、TargetTemplateTableName CHAR(50))
-
ベギン
-
CALLのPROC1(SourceDBName、SourceTableName)。
-
CALLのPROC2(TargetDBName、TargetTemplateTableName)。
-
END $$
-
注:実行する前に、システム・パラメータは、変数「sql_notes」である必要は0に設定されている、または時間のDROP TABLEのPROC1は停止します。その理由は、
-
-
「SQL_NOTES = {0 | 1}
-
1(デフォルト)に設定されている場合、注意レベルの警告が記録されています。
-
0に設定すると、ノートの警告が抑制されています。」