MySQLのストアドプロシージャ、データ変換のデータベースに格納されている列列タイプのデータ、データ挿入バルク

各フィールドに格納されたコンテンツ内のコンテンツの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から抽出する必要があります。

公開された36元の記事 ウォン称賛19 ビュー30000 +

おすすめ

転載: blog.csdn.net/qq_27182767/article/details/84728455