各フィールドに格納されたコンテンツ内のコンテンツの1 Aテーブルは、一つのレコードは、フィールドの内容のみが含まれ、表B COLUMN_IDフィールド名、各レコードのフィールド名を表します。
2.表AおよびBは、結合、テーブル記憶のラインAに、および表Bフィールド名のCOLUMN_IDに複数のレコード。
A及びBは、一時テーブル20に挿入された3ラインデータテーブル毎に一時テーブルの形で挿入されます。
persion_id | コンテンツ | unique_flag |
1 | 小さな | 123 |
1 | 22 | 123 |
1 | 男性 | 123 |
COLUMN_ID | table_idが |
フルネーム | インフォ |
年齢 | インフォ |
性別 | インフォ |
persion_id | フルネーム | 年齢 | 性別 | unique_flag |
1 | 小さな | 22 | 男性 | 123 |
データは、テーブル情報を取得するために、図1、図2、図3によれば、上記の要件の形で得られます。
ソリューション:
1.可変フィールドに、データベース・テーブル内の必要な割り当てから変数を定義し、環状操作、インサートあたりのフィールド数、などが挙げられます。
-変数の定義
DECLARE INSERT SQL VARCHAR(10000)文字セットをUTF8;
DECLARE valueSql VARCHAR(40000)文字セットをUTF8;
-カーソルのサイクルが完了したか否かを判断するステップと、INTは、DEFAULT 0 DONE DECLAREは
、INT内のフラグDEFAULT 0 DECLAREを
DECLAREのpatient_id1 VARCHAR(80)CHARACTER SET UTF8、
VARCHAR(4000)column_id1 DECLARE文字セットUTF8 DEFAULT 0;
DECLAREのcontent1 VARCHAR(4000)文字セットUTF8;
。VARCHAR(40)unique_flag2 DECLARE文字セットUTF8 DEFAULT 1、
VARCHAR(40)unique_flag1 DECLARE文字セットUTF8;
DECLARE J VARCHAR (40)DEFAULT 1; -レコードの変更のフィールドの数、動的挿入値の変数の名前と値が
CNT VARCHAR(40)DEFAULT 0を宣言 ; - カウンタは、レコードの数が追加されたカウント
カーソルを定義2、表A及びBは、処理すべきデータを取得するために接続されています。
DECLARE MyCursorとCURSOR FOR SELECTの
a.patient_id、
b.table_id、
b.column_id、
a.contentは、
a.unique_flag
qs_answerから
LEFTはa.unique_key = b.answer_id ON ques_columns_master bをJOIN
とa.question_id = b.question_idここで、B。テーブル識別= '健康'とa.delete_flag = 0
a.unique_flag BY ORDER。
DECLAREはHANDLER FOR = 1で行わNOT FOUNDはSET CONTINUE;
3.変数の初期化、insertSqlとvalueSqlの初期化
SET insertSql = CONCAT( 'healthtmp(patient_id、unique_flagへの挿入、');
SET valueSql = '値'。
4.オープンカーソル、各読取り値を処理し、カーソル、および値insertSql valueSqlに渡され、そしてすべての20のカウントとスプライスinsertSql valueSql文でおよびSQLステートメントを実行します。
-オープンカーソル
OPEN MyCursorと;
param_loop:LOOP
patient_id1、table_id1、column_id1、content1、unique_flag1 INTO MyCursorとFETCH;
IF DONE = 1 THEN。
LEAVEのparam_loop;
END IF;
SET内のフラグ= 1;
CNT <= 20は、あるIF
IF THEN unique_flag2 = unique_flag1 //異なるunique_flagにレコードを挿入するため
のラインメモリが必要にJ <12 THEN //すべてのレコードの記憶列のフィールド12は、存在する場合
SET insertSql = CONCAT(insertSql、column_id1を 、「」)。
END IF;
IFは、次に= 12 Jが
SET挿入SQL = CONCAT(INSERT SQL、column_id1、 '')); //各20のインサートSQL INSERTステートメント1つだけ挿入フィールドを必要とします
END IF;
IFはTHEN // content1はcontent1が空である場合、結果はフィールドのヌル値として扱われるべきデータベースのニーズに格納され、ヌル連結接続であるNULL IS
'= SETのcontent1;
END IF;
IF MOD 12は、J = 0 THEN 12 @コンテンツあたりの値である
。SET valueSql = CONCAT(valueSql、 ''、content1、 '' '' ')')
; END IF
IFは、次にJ = MOD 12が0!
SET valueSql = CONCAT (valueSql、 ''、content1、 ''、 '');
END IF;
SET J = J + 1;
END IF;
IF unique_flag2!= unique_flag1 THEN
SET CNT = CNT + 1。
THEN = 21 CNTはIFである
IF =内のフラグ1 THEN。
SET = valueSqlストリング(valueSql ,. 1、CHAR_LENGTH(valueSql)-1);
SET @ SqlCmd1 = CONCAT(INSERT SQL、valueSql); // 20記録、縫合およびINSERT SQL valueSql、 SqlCmd1を実行、データベースに結果を挿入
@ SqlCmd1 FROM STMT PREPARE;
STMTを実行し、
SET挿入SQL = CONCAT( 'INSERT INTOのhealthtmp(patient_id、unique_flag、');
SET valueSql = CONCAT( '値');
END IF;
SET CNT 1 =;
SET 1 = J。
END IF;
J <12 THEN IF
SET insertSql = CONCAT(insertSql、column_id1、 '')。
END IF;
J = 12 THEN IF
SET insertSql = CONCAT(insertSql、column_id1、 ''));
END IF;
update_date1がnullの場合、
SET update_date1 = '';
END IF;
content1がnullの場合、
SET content1 = '';
END IF;
SET valueSql = CONCAT(valueSql、 ' (' ''、patient_id1、 '' '' ''、unique_flag1、 '' '' ''、content1、 '' ''); //場合、他のフィールドの初期値割り当て
SET J = J + 1;
SET unique_flag2 = unique_flag1;
END IF;
END IF;
END LOOPのparam_loop;
-最後の記録を挿入
SET = valueSqlストリング(valueSql ,. 1、CHAR_LENGTH(valueSql)-1)
。IF =のフラグ1 THEN
SET @ SqlCmd1 = CONCAT(INSERT SQL、valueSql);
@ SqlCmd1 FROM STMT PREPARE、
EXECUTE STMT;
END IF;
閉じるMyCursorと;
各値の値がコンマを追加する必要が後に挿入し、コンマ必要性が時に最後の値に除去するために、中国がフィールドに存在するため、正しくCHAR_LENGTH傍受傍受を使用する必要があり、最後の値valueSqlから抽出する必要があります。