sexta-feira, 3 de agosto de 2012

ETL

O código ETL foi feito em php.
Para agilizar o processo de extração, foi necessário a retirada dos índices das tabelas. O índices são funcionais para buscas, mas podem dificultar quando são necessárias numerosas inserções.
O tempo total do processo foi e 24 horas e foram feitos blocos de 10000 linhas para ser dado o "commit"

_______________________________________________________________________________

<?php

class Clinica extends Conexao {
   
    private $bloco = 10000;
        public function ETLMedico() {
        $conexao = new Conexao();
        $totalMedicos = $conexao->executeSQLBancoReal("SELECT count(*) as total FROM clin_medico");
        $total = mysql_fetch_array($totalMedicos);
        if ($total["total"] < $this->bloco){
            $inicio = 0;
            $final = $total["total"];
        }else{
            $inicio = 0;
            $final = $this->bloco;
        }
        while ($total["total"] >= $final){
            $resultado = $conexao->executeSQLBancoReal("SELECT medi_nome, medi_crm, medi_especialidade, medi_ativo FROM clin_medico");
            $inserir = "INSERT INTO clin_medico (medi_nome, medi_crm, medi_especialidade, medi_ativo) VALUES ";
            $max = 0;
            while ($rows = mysql_fetch_array($resultado)){
                if ($max < 100){
                    if ($max == 0){
                        $inserir .= "('".$rows["medi_nome"]."', '".$rows["medi_crm"]."', '".$rows["medi_especialidade"]."', '".$rows["medi_ativo"]."')";
                    }else{
                        $inserir .= ", ('".$rows["medi_nome"]."', '".$rows["medi_crm"]."', '".$rows["medi_especialidade"]."', '".$rows["medi_ativo"]."')";
                    }
                    $max++;
                }else{
                    $max = 0;
                    $inserir .= ", ('".$rows["medi_nome"]."', '".$rows["medi_crm"]."', '".$rows["medi_especialidade"]."', '".$rows["medi_ativo"]."')";
                    $result = $conexao->executeSQL($inserir);       
                    if ($result == false){
                        while ($result == false){
                            $result = $conexao->executeSQL($inserir);
                        }   
                        $conexao->executeSQL("INSERT INTO clin_auditoria (aud_descricao) VALUES ('Houve ROLLBACK na insercao da tabela clin_medico no bloco de $inicio a $final')");
                    }else{
                        $inserir = "INSERT INTO clin_medico (medi_nome, medi_crm, medi_especialidade, medi_ativo) VALUES ";
                    }
                }
            }
            $result = $conexao->executeSQL($inserir);
            if ($result == false){
                while ($result == false){
                    $result = $conexao->executeSQL($inserir);
                }   
                $conexao->executeSQL("INSERT INTO clin_auditoria (aud_descricao) VALUES ('Houve ROLLBACK na insercao da tabela clin_medico no bloco de $inicio a $final')");
            }
            if ($final == $total["total"]){
                $final++;
            }else{
                $inicio = $final;
                $final += $this->bloco;
                if ($final > $total["total"]){
                    $final = $total["total"];
                }
            }
        }
    }
   
    public function ETLExames() {
        $conexao = new Conexao();
        $totalExames = $conexao->executeSQLBancoReal("SELECT count(*) as total FROM clin_exames");
        $total = mysql_fetch_array($totalExames);
        if ($total["total"] < $this->bloco){
            $inicio = 0;
            $final = $total["total"];
        }else{
            $inicio = 0;
            $final = $this->bloco;
        }
        while ($total["total"] >= $final){
            $resultado = $conexao->executeSQLBancoReal("SELECT exam_nome, exam_ativo FROM clin_exames");
            $inserir = "INSERT INTO clin_exames (exam_nome, exam_ativo) VALUES ";
            $max = 0;
            while ($rows = mysql_fetch_array($resultado)){
                if ($max < 100){
                    if ($max == 0){
                        $inserir .= "('".$rows["exam_nome"]."', '".$rows["exam_ativo"]."')";
                    }else{
                        $inserir .= ", ('".$rows["exam_nome"]."', '".$rows["exam_ativo"]."')";
                    }
                    $max++;
                }else{
                    $max = 0;
                    $inserir .= ", ('".$rows["exam_nome"]."', '".$rows["exam_ativo"]."')";
                    $result = $conexao->executeSQL($inserir);       
                    if ($result == false){
                        while ($result == false){
                            $result = $conexao->executeSQL($inserir);
                        }
                        $conexao->executeSQL("INSERT INTO clin_auditoria (aud_descricao) VALUES ('Houve ROLLBACK na insercao da tabela clin_exames no bloco de $inicio a $final')");
                    }else{
                        $inserir = "INSERT INTO clin_exames (exam_nome, exam_ativo) VALUES ";
                    }
                }
            }
            $result = $conexao->executeSQL($inserir);
            if ($result == false){
                while ($result == false){
                    $result = $conexao->executeSQL($inserir);
                }
                $conexao->executeSQL("INSERT INTO clin_auditoria (aud_descricao) VALUES ('Houve ROLLBACK na insercao da tabela clin_exames no bloco de $inicio a $final')");
            }
            if ($final == $total["total"]){
                $final++;
            }else{
                $inicio = $final;
                $final += $this->bloco;
                if ($final > $total["total"]){
                    $final = $total["total"];
                }
            }
        }
    }
   
    public function ETLEmpresa() {
        $conexao = new Conexao();
        $totalEmpresas = $conexao->executeSQLBancoReal("SELECT count(*) as total FROM clin_empresa");
        $total = mysql_fetch_array($totalEmpresas);
        if ($total["total"] < $this->bloco){
            $inicio = 0;
            $final = $total["total"];
        }else{
            $inicio = 0;
            $final = $this->bloco;
        }
        while ($total["total"] >= $final){
            $resultado = $conexao->executeSQLBancoReal("SELECT empr_cnpj, empr_razao_social, empr_fantasia, empr_rua, empr_numero, empr_complemento, empr_bairro, empr_cidade, empr_estado, empr_pais, empr_data_cadastro, empr_ativo FROM clin_empresa");
            $inserir = "INSERT INTO clin_empresa (empr_cnpj, empr_razao_social, empr_fantasia, empr_rua, empr_numero, empr_complemento, empr_bairro, empr_cidade, empr_estado, empr_pais, empr_data_cadastro, empr_ativo) VALUES ";
            $max = 0;
            while ($rows = mysql_fetch_array($resultado)){
                if ($max < 100){
                    if ($max == 0){
                        $inserir .= "('".$rows["empr_cnpj"]."','".$rows["empr_razao_social"]."', '".$rows["empr_fantasia"]."', '".$rows["empr_rua"]."', '".$rows["empr_numero"]."', '".$rows["empr_complemento"]."', '".$rows["empr_bairro"]."', '".$rows["empr_cidade"]."', '".$rows["empr_estado"]."', '".$rows["empr_pais"]."', '".$rows["empr_data_cadastro"]."', '".$rows["empr_ativo"]."')";
                    }else{
                        $inserir .= ", ('".$rows["empr_cnpj"]."','".$rows["empr_razao_social"]."', '".$rows["empr_fantasia"]."', '".$rows["empr_rua"]."', '".$rows["empr_numero"]."', '".$rows["empr_complemento"]."', '".$rows["empr_bairro"]."', '".$rows["empr_cidade"]."', '".$rows["empr_estado"]."', '".$rows["empr_pais"]."', '".$rows["empr_data_cadastro"]."', '".$rows["empr_ativo"]."')";
                    }
                    $max++;
                }else{
                    $max = 0;
                    $inserir .= ", ('".$rows["empr_cnpj"]."','".$rows["empr_razao_social"]."', '".$rows["empr_fantasia"]."', '".$rows["empr_rua"]."', '".$rows["empr_numero"]."', '".$rows["empr_complemento"]."', '".$rows["empr_bairro"]."', '".$rows["empr_cidade"]."', '".$rows["empr_estado"]."', '".$rows["empr_pais"]."', '".$rows["empr_data_cadastro"]."', '".$rows["empr_ativo"]."')";
                    $result = $conexao->executeSQL($inserir);
                    if ($result == false){
                        while ($result == false){
                            $result = $conexao->executeSQL($inserir);
                        }   
                        $conexao->executeSQL("INSERT INTO clin_auditoria (aud_descricao) VALUES ('Houve ROLLBACK na insercao da tabela clin_empresa no bloco de $inicio a $final')");
                    }else{
                        $inserir = "INSERT INTO clin_empresa (empr_cnpj, empr_razao_social, empr_fantasia, empr_rua, empr_numero, empr_complemento, empr_bairro, empr_cidade, empr_estado, empr_pais, empr_data_cadastro, empr_ativo) VALUES ";
                    }
                }
            }
            $result = $conexao->executeSQL($inserir);
            if ($result == false){
                while ($result == false){
                    $result = $conexao->executeSQL($inserir);
                }
                $conexao->executeSQL("INSERT INTO clin_auditoria (aud_descricao) VALUES ('Houve ROLLBACK na insercao da tabela clin_empresa no bloco de $inicio a $final')");
            }
            if ($final == $total["total"]){
                $final++;
            }else{
                $inicio = $final;
                $final += $this->bloco;
                if ($final > $total["total"]){
                    $final = $total["total"];
                }
            }
        }
    }
   
    public function ETLFuncionario() {
        $conexao = new Conexao();
        $resultado = $conexao->executeSQLBancoReal("SELECT func_empr_fk_empresa, func_empr_nome, func_empr_rg, func_empr_cpf, func_empr_rua, func_empr_numero, func_empr_complemento, func_empr_bairro, func_empr_cidade, func_empr_estado, func_empr_pais, func_empr_data_cadastro, func_empr_ativo FROM clin_funcionario_empresa");
        $inserir = "INSERT INTO clin_funcionario_empresa (func_empr_fk_empresa, func_empr_nome, func_empr_rg, func_empr_cpf, func_empr_rua, func_empr_numero, func_empr_complemento, func_empr_bairro, func_empr_cidade, func_empr_estado, func_empr_pais, func_empr_data_cadastro, func_empr_ativo) VALUES ";
        $max = 0;
        while ($rows = mysql_fetch_array($resultado)){
            if ($max < 100){
                if ($max == 0){
                    $inserir .= "('".$rows["func_empr_fk_empresa"]."','".$rows["func_empr_nome"]."', '".$rows["func_empr_rg"]."', '".$rows["func_empr_cpf"]."', '".$rows["func_empr_rua"]."', '".$rows["func_empr_numero"]."', '".$rows["func_empr_complemento"]."', '".$rows["func_empr_bairro"]."', '".$rows["func_empr_cidade"]."', '".$rows["func_empr_estado"]."', '".$rows["func_empr_pais"]."', '".$rows["func_empr_data_cadastro"]."', '".$rows["func_empr_ativo"]."')";
                }else{
                    $inserir .= ", ('".$rows["func_empr_fk_empresa"]."','".$rows["func_empr_nome"]."', '".$rows["func_empr_rg"]."', '".$rows["func_empr_cpf"]."', '".$rows["func_empr_rua"]."', '".$rows["func_empr_numero"]."', '".$rows["func_empr_complemento"]."', '".$rows["func_empr_bairro"]."', '".$rows["func_empr_cidade"]."', '".$rows["func_empr_estado"]."', '".$rows["func_empr_pais"]."', '".$rows["func_empr_data_cadastro"]."', '".$rows["func_empr_ativo"]."')";
                }
                $max++;
            }else{
                $max = 0;
                $inserir .= ", ('".$rows["func_empr_fk_empresa"]."','".$rows["func_empr_nome"]."', '".$rows["func_empr_rg"]."', '".$rows["func_empr_cpf"]."', '".$rows["func_empr_rua"]."', '".$rows["func_empr_numero"]."', '".$rows["func_empr_complemento"]."', '".$rows["func_empr_bairro"]."', '".$rows["func_empr_cidade"]."', '".$rows["func_empr_estado"]."', '".$rows["func_empr_pais"]."', '".$rows["func_empr_data_cadastro"]."', '".$rows["func_empr_ativo"]."')";
                $result = $conexao->executeSQL($inserir);
                if ($result == false){
                    while ($result == false){
                        $result = $conexao->executeSQL($inserir);
                    }   
                    $conexao->executeSQL("INSERT INTO clin_auditoria (aud_descricao) VALUES ('Houve ROLLBACK na insercao da tabela clin_funcionario_empresa no bloco de $inicio a $final')");
                }else{
                    $inserir = "INSERT INTO clin_funcionario_empresa (func_empr_fk_empresa, func_empr_nome, func_empr_rg, func_empr_cpf, func_empr_rua, func_empr_numero, func_empr_complemento, func_empr_bairro, func_empr_cidade, func_empr_estado, func_empr_pais, func_empr_data_cadastro, func_empr_ativo) VALUES ";
                }
            }
        }
        $result = $conexao->executeSQL($inserir);
        if ($result == false){
            while ($result == false){
                $result = $conexao->executeSQL($inserir);
            }
            $conexao->executeSQL("INSERT INTO clin_auditoria (aud_descricao) VALUES ('Houve ROLLBACK na insercao da tabela clin_funcionario_empresa no bloco de $inicio a $final')");
        }
    }
   
    public function ETLRealizacaodeExames() {
        $conexao = new Conexao();
        //$resuLaudo = mysql_fetch_assoc($conexao->executeSQLBancoReal("SELECT count(*) as total FROM clin_func_empr_exames"));
        //echo $resuLaudo["total"];
        //ceil();
        $codigo = 5630548;
        $fim = 7949663;
        $resultado = $conexao->executeSQLBancoReal("SELECT clin_func_empr_exam_codigo, clin_func_empr_exam_fk_funcionario, clin_func_empr_exam_fk_exames, clin_func_empr_exam_data_exame, clin_func_empr_exam_qtd, clin_func_empr_exam_valor FROM clin_func_empr_exames WHERE clin_func_empr_exam_codigo > $codigo AND clin_func_empr_exam_codigo <= $fim ORDER BY clin_func_empr_exam_codigo ASC");
        //exit;
        $max = 0;
        $insertTempoExame = "INSERT INTO clin_tempo_exame (temp_exam_codigo, temp_exam_dia, temp_exam_mes, temp_exam_ano) VALUES ";
        $insertTempoLaudo = "INSERT INTO clin_tempo_laudo (temp_laudo_codigo, temp_laudo_dia, temp_laudo_mes, temp_laudo_ano) VALUES ";
        $insertExamesFunc = "INSERT INTO clin_func_empr_exames (clin_func_empr_exam_fk_tempo_exame, clin_func_empr_exam_fk_tempo_laudo, clin_func_empr_exam_fk_funcionario, clin_func_empr_exam_fk_exames, clin_func_empr_exam_fk_medico, clin_func_empr_exam_laudo, clin_func_empr_exam_qtd, clin_func_empr_exam_valor) VALUES ";
        while ($rows = mysql_fetch_array($resultado)){
            $resultadoLaudo = $conexao->executeSQLBancoReal("SELECT * FROM clin_laudo WHERE laudo_fk_func_empr_exames = '".$rows["clin_func_empr_exam_codigo"]."'");
            $dataExame = explode("-",$rows["clin_func_empr_exam_data_exame"]);
            $tempExDia = $dataExame[2];
            $tempExMes = $dataExame[1];
            $tempExAno = $dataExame[0];
            $boolLaudo = mysql_num_rows($resultadoLaudo);
            if ($boolLaudo > 0){
                $resuLaudo = mysql_fetch_assoc($resultadoLaudo);
                $dataLaudo = explode("-",$resuLaudo["laudo_data"]);
                $tempLdDia = $dataLaudo[2];
                $tempLdMes = $dataLaudo[1];
                $tempLdAno = $dataLaudo[0];
            }
            $codigo++;
            $idTempExame = $codigo;
            $idTempLaudo = $codigo;
            if ($max < 100){
                if ($max == 0){
                    $insertTempoExame .= "('".$idTempExame."', '".$tempExDia."', '".$tempExMes."','".$tempExAno."')";
                    if ($boolLaudo > 0){
                        $insertTempoLaudo .= "('".$idTempLaudo."', '".$tempLdDia."', '".$tempLdMes."','".$tempLdAno."')";
                    }
                    if ($boolLaudo > 0){
                        $insertExamesFunc .= "('".$idTempExame."', '".$idTempLaudo."', '".$rows["clin_func_empr_exam_fk_funcionario"]."', '".$rows["clin_func_empr_exam_fk_exames"]."', '".$resuLaudo["laudo_fk_medico"]."', '".$resuLaudo["laudo_descricao"]."', '".$rows["clin_func_empr_exam_qtd"]."', '".$rows["clin_func_empr_exam_valor"]."')";
                    }else{
                        $insertExamesFunc .= "('".$idTempExame."', '".$idTempLaudo."', '".$rows["clin_func_empr_exam_fk_funcionario"]."', '".$rows["clin_func_empr_exam_fk_exames"]."', '".$resuLaudo["laudo_fk_medico"]."', '".$resuLaudo["laudo_descricao"]."', '".$rows["clin_func_empr_exam_qtd"]."', '".$rows["clin_func_empr_exam_valor"]."')";
                    }
                }else{
                    $insertTempoExame .= ", ('".$idTempExame."', '".$tempExDia."', '".$tempExMes."','".$tempExAno."')";
                    if ($boolLaudo > 0){
                        $insertTempoLaudo .= ", ('".$idTempLaudo."', '".$tempLdDia."', '".$tempLdMes."','".$tempLdAno."')";
                    }
                    if ($boolLaudo > 0){
                        $insertExamesFunc .= ", ('".$idTempExame."', '".$idTempLaudo."', '".$rows["clin_func_empr_exam_fk_funcionario"]."', '".$rows["clin_func_empr_exam_fk_exames"]."', '".$resuLaudo["laudo_fk_medico"]."', '".$resuLaudo["laudo_descricao"]."', '".$rows["clin_func_empr_exam_qtd"]."', '".$rows["clin_func_empr_exam_valor"]."')";
                    }else{
                        $insertExamesFunc .= ", ('".$idTempExame."', '".$idTempLaudo."', '".$rows["clin_func_empr_exam_fk_funcionario"]."', '".$rows["clin_func_empr_exam_fk_exames"]."', '".$resuLaudo["laudo_fk_medico"]."', '".$resuLaudo["laudo_descricao"]."', '".$rows["clin_func_empr_exam_qtd"]."', '".$rows["clin_func_empr_exam_valor"]."')";
                    }
                }
                $max++;
            }else{
                $max = 0;
                /*TEMPO EXAME*/
                $insertTempoExame .= ", ('".$idTempExame."', '".$tempExDia."', '".$tempExMes."','".$tempExAno."')";
                $result1 = $conexao->executeSQL($insertTempoExame);
                if ($result1 == false){
                    while ($result1 == false){
                        $result1 = $conexao->executeSQL($insertTempoExame);
                    }   
                    $conexao->executeSQL("INSERT INTO clin_auditoria (aud_descricao) VALUES ('Houve ROLLBACK na insercao da tabela clin_tempo_exame no bloco de $inicio a $final')");
                }else{
                    $insertTempoExame = "INSERT INTO clin_tempo_exame (temp_exam_codigo, temp_exam_dia, temp_exam_mes, temp_exam_ano) VALUES ";
                }
                /*TEMPO LAUDO*/
                if ($boolLaudo > 0){
                    $insertTempoLaudo .= ", ('".$idTempLaudo."', '".$tempLdDia."', '".$tempLdMes."','".$tempLdAno."')";
                }
                $result2 = $conexao->executeSQL($insertTempoLaudo);
                if ($result2 == false){
                    while ($result2 == false){
                        $result2 = $conexao->executeSQL($insertTempoLaudo);
                        $conexao->executeSQL("INSERT INTO clin_auditoria (aud_descricao) VALUES ('Houve ROLLBACK na insercao da tabela clin_tempo_laudo no bloco de $inicio a $final')");
                    }
                }else{
                    $insertTempoLaudo = "INSERT INTO clin_tempo_laudo (temp_laudo_codigo, temp_laudo_dia, temp_laudo_mes, temp_laudo_ano) VALUES ";   
                }
               
                /*EXAMES DOS FUNCS*/
                if ($boolLaudo > 0){
                    $insertExamesFunc .= ", ('".$idTempExame."', '".$idTempLaudo."', '".$rows["clin_func_empr_exam_fk_funcionario"]."', '".$rows["clin_func_empr_exam_fk_exames"]."', '".$resuLaudo["laudo_fk_medico"]."', '".$resuLaudo["laudo_descricao"]."', '".$rows["clin_func_empr_exam_qtd"]."', '".$rows["clin_func_empr_exam_valor"]."')";
                }else{
                    $insertExamesFunc .= ", ('".$idTempExame."', '".$idTempLaudo."', '".$rows["clin_func_empr_exam_fk_funcionario"]."', '".$rows["clin_func_empr_exam_fk_exames"]."', '".$resuLaudo["laudo_fk_medico"]."', '".$resuLaudo["laudo_descricao"]."', '".$rows["clin_func_empr_exam_qtd"]."', '".$rows["clin_func_empr_exam_valor"]."')";
                }
                $result3 = $conexao->executeSQL($insertExamesFunc);
                if ($result3 == false){
                    while ($result3 == false){
                        $result3 = $conexao->executeSQL($insertExamesFunc);
                        $conexao->executeSQL("INSERT INTO clin_auditoria (aud_descricao) VALUES ('Houve ROLLBACK na insercao da tabela clin_func_empr_exames no bloco de $inicio a $final')");
                    }
                }else{               
                    $insertExamesFunc = "INSERT INTO clin_func_empr_exames (clin_func_empr_exam_fk_tempo_exame, clin_func_empr_exam_fk_tempo_laudo, clin_func_empr_exam_fk_funcionario, clin_func_empr_exam_fk_exames, clin_func_empr_exam_fk_medico, clin_func_empr_exam_laudo, clin_func_empr_exam_qtd, clin_func_empr_exam_valor) VALUES ";
                }
            }
        }
        $result1 = $conexao->executeSQL($insertTempoExame);
        if ($result1 == false){
            while ($result1 == false){
                $result1 = $conexao->executeSQL($insertTempoExame);
                $conexao->executeSQL("INSERT INTO clin_auditoria (aud_descricao) VALUES ('Houve ROLLBACK na insercao da tabela clin_tempo_exame no bloco de $inicio a $final')");
            }
        }
        $result2 = $conexao->executeSQL($insertTempoLaudo);
        if ($result2 == false){
            while ($result2 == false){
                $result2 = $conexao->executeSQL($insertTempoLaudo);
                $conexao->executeSQL("INSERT INTO clin_auditoria (aud_descricao) VALUES ('Houve ROLLBACK na insercao da tabela clin_tempo_laudo no bloco de $inicio a $final')");
            }
        }
        $result3 = $conexao->executeSQL($insertExamesFunc);
        if ($result3 == false){
            while ($result3 == false){
                $result3 = $conexao->executeSQL($insertExamesFunc);
                $conexao->executeSQL("INSERT INTO clin_auditoria (aud_descricao) VALUES ('Houve ROLLBACK na insercao da tabela clin_func_empr_exames no bloco de $inicio a $final')");
            }
        }
    }
}

?>

Nenhum comentário:

Postar um comentário