mayor mysql procedimiento almacenado, los datos en la base de datos almacenada tipo de columna-fila de conversión de datos, los datos insertados

1. Una tabla de contenidos en el contenido almacenado en cada campo, un registro contiene sólo el contenido de un campo, representa la tabla B nombre de campo column_id, un nombre de campo para cada registro.

2. Tablas A y B de unión, la pluralidad de registros en la línea A en el almacenamiento de la tabla, y en column_id de la Tabla B nombre de campo.

3. Las tablas de datos de la línea A y B se insertó en la tabla temporal 20 se inserta en cada forma de tabla temporal.

persion_id contenido unique_flag
1 pequeño 123
1 22 123
1 masculino 123
column_id table_id
nombre completo info
edad info
género info
persion_id nombre completo edad género unique_flag
1 pequeño 22 masculino 123

Los datos obtenidos en la forma de los requisitos anteriores, según la Fig. 1, la Fig. 2 Fig. 3 para obtener información de la tabla.

solución:

1. Definir variable de la asignación requerida en una tabla de base de datos a un campo variable, y el funcionamiento cíclico, el número de campos por inserción, y similares.

- definición de las variables
    de la DECLARE INSERT SQL VARCHAR (10000) el CARÁCTER la UTF8 SET;  
    la DECLARE valueSql VARCHAR (40000) el CARÁCTER la UTF8 SET;
    la DECLARE la INT hecho el DEFAULT 0; - determinar si el ciclo de cursor se completa
    la DECLARE la INT En la bandera de la DEFAULT 0;
    la patient_id1 DECLARE VARCHAR (80) el CARÁCTER la UTF8 SET;
    la DECLARE column_id1 VARCHAR (4000) el caracter el SET UTF8 la DEFAULT 0;
    la DECLARE content1 VARCHAR (4000) el CARÁCTER la UTF8 SET;
    la DECLARE unique_flag2 VARCHAR (40) el carácter el SET UTF8 la DEFAULT 1;.
    la DECLARE unique_flag1 VARCHAR (40) el CARÁCTER la UTF8 SET;
    la DECLARE J VARCHAR (40) DEFAULT 1 - número de campos de un cambio de registro, los nombres de variables valor inserción dinámica y valores
    declare (40) DEFAULT 0 CNT VARCHAR ; - contador cuenta se ha añadido el número de registros

2. Definir un cursor, las tablas A y B están conectados para obtener datos a ser procesados.

DECLARE CURSOR mycursor PARA SELECCIONAR 
        a.patient_id,
        b.table_id,
        b.column_id,
        a.content,
        a.unique_flag 
    de qs_answer una
    combinación izquierda ques_columns_master b = EN a.unique_key b.answer_id  
    y a.question_id = b.question_id donde b. table_id = 'salud' y a.delete_flag = 0 
    ORDER BY a.unique_flag;
    DECLARE CONTINUE Manejador de NO ENCONTRADO SET hecho = 1;

3. inicialización de variables, la inicialización de insertSql y valueSql

SET insertSql = CONCAT ( 'inserto en healthtmp (Patient_ID, unique_flag,');
SET valueSql = 'valores';

4. Abrir el cursor, el cursor procesar cada valor de lectura, y los valores pasados ​​al insertSql valueSql, y en cada 20 recuentos y empalme declaración insertSql valueSql y instrucción se ejecuta SQL.

- Abrir el cursor
    OPEN MyCursor;
    param_loop: BUCLE    
        la FETCH MyCursor la patient_id1 INTO, table_id1, column_id1, Content1, unique_flag1;
        . La IF = DONE 1 ENTONCES
            el param_loop permiso;
        al final la SI;
    . El SET En Flag = 1;
    el SI el CNT <= 20 es ENTONCES
                la IF THEN unique_flag2 = unique_flag1 // en diferente unique_flag para insertar un registro
                        si j <12 THEN // cada registro hay un campo 12 de columnas de almacenamiento, en la memoria de línea requerida
                            SET insertSql = CONCAT (insertSql, column_id1 , '');
                        el Si el extremo;
                        el SI ENTONCES J = 12 es 
                            el SET insertar SQL = CONCAT (INSERT SQL, column_id1, ')'); // para cada 20 insertar SQL inserto declaraciones requiere sólo un campo inserto
                        El Si el extremo;
            el IF THEN // Content1 la IS NULL cuando Content1 está vacía, el resultado es nulo la conexión concat, almacenada en las necesidades de base de datos a ser tratado como un valor de campo nulo
                                el Content1 SET = '';
                        al final la SI;
            la IF MOD 12 es J = 0 THEN @ 12 es un valor por contenido
                            el SET valueSql = CONCAT (valueSql, '' '', content1 '', '', '),');
                        al final la SI;
             0 la IF THEN J = MOD 12 es
                            el SET valueSql = CONCAT (valueSql, '' '', content1 '', '', '');
                        al final la SI;
                            la SET J = J + 1;.
             al final, el SI;
                la IF unique_flag2!= unique_flag1 ENTONCES
                        SET CNT = CNT + 1;
                         Entonces la CNT = 21 es la IF
                            el IF = En la bandera 1 THEN. 
                                El SET = valueSql la subcadena (valueSql ,. 1, CHAR_LENGTH (valueSql) -1); 
                                el SET @ SqlCmd1 = CONCAT (INSERT SQL, valueSql); // 20 cuando la grabación, cosiendo y INSERT SQL valueSql, realizar SqlCmd1, inserta el resultado en la base de datos de
                                la PREPARE stmt la de @ SqlCmd1;
                                la stmt ejecutar;
                                SET insertar SQL = CONCAT ( 'healthtmp insertar en (Patient_ID, unique_flag,');
                                SET valueSql = CONCAT ( 'los valores');
                            al final la SI;
                                la SET la CNT . 1 =;
                                el SET 1 = J.;
                        TERMINARA SI;
                        Si j <12 ENTONCES 
                                SET insertSql = CONCAT (insertSql, column_id1, '');    
                        TERMINARA SI;
                        Si j = 12 ENTONCES
                                SET insertSql = CONCAT (insertSql, column_id1, ')');    
                        TERMINARA SI;
                        SI update_date1 IS NULL ENTONCES 
                                SET update_date1 = '';
                        TERMINARA SI;
                        SI ES NULO ENTONCES Content1 
                                Content1 SET = '';
                        TERMINARA SI;
                        SET valueSql = CONCAT (valueSql, ' (' '', patient_id1, '' '' '', unique_flag1, '' '' '', Content1, '' ''); // Cuando los valores iniciales de otros campos asignación
                        . el SET J = J + 1;
                        el SET unique_flag2 = unique_flag1;
                al final la SI;
         al final la SI;
  la param_loop FIN bucle;
   - la inserción de la última grabación 
    el SET = valueSql la subcadena (valueSql ,. 1, CHAR_LENGTH (valueSql) -1); 
        la bandera IF = En 1. ENTONCES 
            SET @ SqlCmd1 = concat (SQL INSERT, valueSql);     
             el preparo stmt el de @ SqlCmd1;
            ; la stmt EJECUTAR
         al final, el SI;
    Cerrar MyCursor;

    Para insertar, después de cada valor de los valores que añadir una coma, necesidad coma para ser retirado cuando el último valor, necesita ser extraído fuera del último valor valueSql, porque hay chinos en el campo, es necesario utilizar correctamente char_length intercepción intercepción.

Publicado 36 artículos originales · ganado elogios 19 · Vistas a 30000 +

Supongo que te gusta

Origin blog.csdn.net/qq_27182767/article/details/84728455
Recomendado
Clasificación