grandes quantidades mysql procedimento armazenado, os dados na base de dados armazenada Tipo de coluna de linha de dados de conversão, os dados inseridos

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.

Publicado 36 artigos originais · ganhou elogios 19 · vê 30000 +

Acho que você gosta

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