1. A tabela de conteúdos no conteúdo armazenado em cada campo, um registro contém apenas o conteúdo de um campo, representa Tabela B nome de campo column_id, um nome de campo para cada registo.
2. Os quadros A e B de ligao, a pluralidade de fichas em linha A no armazenamento de tabela, e em column_id da Tabela B a nome campo.
3. As tabelas de dados da linha A e B foi inserida na tabela temporário 20 é inserido em cada forma de tabela temporária.
persion_id | conteúdo | unique_flag |
1 | pequeno | 123 |
1 | 22 | 123 |
1 | masculino | 123 |
column_id | table_id |
nome completo | informações |
idade | informações |
sexo | informações |
persion_id | nome completo | idade | sexo | unique_flag |
1 | pequeno | 22 | masculino | 123 |
Dados obtidos na forma dos requisitos acima referidos, de acordo com a Fig. 1, Fig. 2 Fig. 3 para obter informações de tabela.
solução:
1. Definir variável da atribuição necessária numa tabela da base de dados a um campo variável, e o funcionamento cíclico, o número de campos por pastilha, e afins.
- definição de variáveis
a DECLARE SQL INSERT VARCHAR (10000) O caractere a UTF-8 SET;
o DECLARE valueSql VARCHAR (40000) O caractere SET UTF-8;
a declarar a INT feito o padrão 0; - determinar se o ciclo do cursor é completada
a declarar a bandeira em Int o padrão 0;
o patient_id1 DECLARE VARCHAR (80) o personagem SET UTF-8;
a DECLARE column_id1 VARCHAR (4000) o caractere SET UTF8 o padrão 0;
o DECLARE content1 VARCHAR (4000) o caractere SET UTF-8;
a DECLARE unique_flag2 VARCHAR (40) o personagem SET UTF8 o PADRÃO 1;.
o DECLARE unique_flag1 VARCHAR (40) o personagem SET UTF-8;
a DECLARE J VARCHAR (40) PADRÃO 1; - o número de campos de uma alteração do registo, os nomes das variáveis inserção valor dinâmico e valores
DECLARE CNT VARCHAR (40) Padrão 0 ; - contador conta tiver sido adicionado o número de registos
2. Definir um cursor, as tabelas A e B são ligados para obter dados a serem processados.
DECLARE mycursor CURSOR FOR SELECT
a.patient_id,
b.table_id,
b.column_id,
a.content,
a.unique_flag
de qs_answer um
LEFT JOIN ques_columns_master b ON a.unique_key = b.answer_id
e a.question_id = b.question_id ONDE b. table_id = 'saúde' e a.delete_flag = 0
ORDER BY a.unique_flag;
DECLARE não continue manipulador para ENCONTRADO SET feito = 1;
3. inicialização variável, inicialização de insertSql e valueSql
SET insertSql = CONCAT ( 'inserção em healthtmp (patient_id, unique_flag,');
SET valueSql = 'valores';
4. Abra o cursor, o cursor processamento de cada valor lido, e os valores passados para insertSql valueSql, e a cada 20 contagens e emenda declaração insertSql valueSql e declaração de executar a SQL.
- Abrir o cursor
OPEN MyCursor;
param_loop: LOOP
a FETCH MyCursor o patient_id1 EM, table_id1, column_id1, content1, unique_flag1;
. O IF = OK 1 ENTÃO
o param_loop sair;
END IF;
. O na bandeira SET = 1;
o se o CNT <= 20 é então
o IF THEN unique_flag2 = unique_flag1 // em unique_flag diferente para inserir uma ficha
sE j <12 THEN // cada registro existe um campo 12 de colunas de armazenamento, para a memória de linha necessária
SET insertSql = CONCAT (insertSql, column_id1 , '');
o se o END;
IF ENTÃO J = 12 é
o SET inserir SQL = CONCAT (inserir SQL, column_id1, ')'); // 20 para cada inserção de inserção SQL demonstrações requer apenas um campo de inserção
A SE o END;
IF ENTÃO // content1 o IS NULL quando content1 está vazia, o resultado é nula a ligação concatenação, armazenados nas necessidades da base de dados a ser tratado como um valor de campo nulo
o content1 SET = '';
o END IF;
IF MOD 12 é J = 0 THEN @ 12 é um valor per conteúdo
do SET valueSql = CONCAT (valueSql, '' '', content1, '' '', '),');
o END IF;
0 a sE ENTÃO J = MOD 12 é
o SET valueSql = CONCAT (valueSql, '' '', content1, '' '', '');
END IF;
SET J = J + 1;.
o END IF;
IF unique_flag2!= unique_flag1 ENTÃO
SET CNT CNT + = 1;
Em seguida, o CNT = 21 é o SE
da Bandeira SE = Em um ENTÃO.
SET = valueSql a subsequência (valueSql ,. 1, CHAR_LENGTH (valueSql) -1);
SET @ SqlCmd1 = CONCAT (SQL INSERT, valueSql); // 20 quando a gravação, costura e SQL INSERT valueSql, realizando SqlCmd1, insere o resultado na base de dados
do PREPARAR decl a DE @ SqlCmd1;
o decl executar;
SET inserir SQL = CONCAT ( 'healthtmp inserir em (patient_id, unique_flag,');
SET valueSql = CONCAT ( 'os VALORES');
END IF;
SET CNT . = 1;
SET 1 = J.;
FIM SE;
SE j <12 THEN
SET insertSql = CONCAT (insertSql, column_id1, '');
FIM SE;
SE J = 12 THEN
SET insertSql = CONCAT (insertSql, column_id1, ')');
FIM SE;
IF update_date1 for nulo,
SET update_date1 = '';
FIM SE;
IF content1 for nulo,
content1 SET = '';
FIM SE;
SET valueSql = CONCAT (valueSql, ' (' '', patient_id1, '' '' '', unique_flag1, '' '' '', content1, '' ''); // Quando os valores iniciais de outros campos atribuição
. SET J = J + 1;
SET unique_flag2 = unique_flag1;
END IF;
END IF;
o param_loop extremidade do laço;
- a inserção da última gravação
SET = valueSql a subsequência (valueSql ,. 1, CHAR_LENGTH (valueSql) -1);
a bandeira SE = Em um. ENTÃO
o SET @ SqlCmd1 = CONCAT (INSERT SQL, valueSql);
PREPARE stmt o de @ SqlCmd1;
; o stmt EXECUTAR
o END IF;
Fechar MyCursor;
Para inserido, após cada valor valores precisam adicionar uma vírgula, necessidade vírgula para ser removido quando o último valor, precisa ser extraído para fora do último valor valueSql, porque há chineses no campo, é necessário usar corretamente char_length interceptação interceptação.