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.