sexta-feira, 18 de agosto de 2017

MySQL - Dump de Procedure e Functions Individuais

O MySQL infelizmente não permite que o dump das Procedures/Functions seja feito separado por objeto.

Para contornar isto, peguei uns scripts na Internet e acabei montando a minha versão.

Para executá-los:

./gera_dump_procedure [host/Ip] [Porta] [Usuário] [Senha] [Banco/Schema] [Procedure] [Diretório para Gravação]

./gera_dump_function [host/Ip] [Porta] [Usuário] [Senha] [Banco/Schema] [Function] [Diretório para Gravação]

Estes scripts são para rodar em ambiente bash (LINUX).

Para obter uma lista dos objetos, pode-se usar os SELECTS

SELECT CONCAT('./gera_dump_procedure.sh [host] [porta] [usuario] [senha] [banco]', ROUTINE_NAME, ' [diretorio]') exec
  FROM INFORMATION_SCHEMA.ROUTINES 
  WHERE ROUTINE_SCHEMA = '[banco]' 
   AND ROUTINE_TYPE = 'PROCEDURE'
;

SELECT CONCAT('./gera_dump_function.sh [host] [porta] [usuario] [senha] [banco]', ROUTINE_NAME, ' [diretorio]') exec
  FROM INFORMATION_SCHEMA.ROUTINES 
  WHERE ROUTINE_SCHEMA = '[banco]' 
   AND ROUTINE_TYPE = 'FUNCTION'
;

Nos SELECTs troque as informações [host] [porta] [usuario] [senha] [banco] e [diretorio] de acordo com a sua necessidade.

Script Gera_Dump_Procedure
#!/bin/bash
##---------------------------------------##
## Gera Arquivo SQL de Procedure MySQL   ##
## Parametros :                          ##
##  1 - Host (IP)                        ##
##  2 - Porta                            ##
##  3 - Usuário                          ##
##  4 - Senha                            ##
##  5 - Database/Schema                  ##
##  6 - Procedure                        ##
##  7 - Diretório                        ##
##---------------------------------------##
    if [ "$#" -ne 7 ];then
   echo "Sintaxe incorreta..."
   echo "Uso: $0 host(ip) porta usuario senha banco procedure diretorio"
   exit
    fi
HOST=${1}
PORTA=${2}
USUARIO=${3}
SENHA=${4}
BANCO=${5}
PROCEDURE=${6}
DIRETORIO=${7}

    ARQ_SAIDA="${DIRETORIO}/${PROCEDURE}.sql"
    
    echo "DROP PROCEDURE IF EXISTS ${PROCEDURE};" > ${ARQ_SAIDA}
    echo 'DELIMITER $$' >> ${ARQ_SAIDA}

    mysql -NB -h${HOST} -P${PORTA} -u ${USUARIO} -p${SENHA} ${BANCO} -e "show create procedure ${PROCEDURE}" |\
    xargs -n 1 -d '\t' echo |\
    egrep '^CREATE' |\
    xargs --null echo -e >> ${ARQ_SAIDA}

    echo '$$' >> ${ARQ_SAIDA}
    echo "DELIMITER ;" >> ${ARQ_SAIDA}

    
Script Gera_Dump_Function
#!/bin/bash
##---------------------------------------##
## Gera Arquivo SQL de Function MySQL    ##
## Parametros :                          ##
##  1 - Host (IP)                        ##
##  2 - Porta                            ##
##  3 - Usuário                          ##
##  4 - Senha                            ##
##  5 - Database/Schema                  ##
##  6 - Function                         ##
##  7 - Diretório                        ##
##---------------------------------------##
    if [ "$#" -ne 7 ];then
    echo "Sintaxe incorreta..."
    echo "Uso: $0 host(ip) porta usuario senha banco function diretorio"
    exit
    fi
HOST=${1}
PORTA=${2}
USUARIO=${3}
SENHA=${4}
BANCO=${5}
FUNCTION=${6}
DIRETORIO=${7}

    ARQ_SAIDA="${DIRETORIO}/${FUNCTION}.sql"
    
    echo "DROP FUNCTION IF EXISTS ${FUNCTION};" > ${ARQ_SAIDA}
    echo 'DELIMITER $$' >> ${ARQ_SAIDA}

    mysql -NB -h${HOST} -P${PORTA} -u ${USUARIO} -p${SENHA} ${BANCO} -e "show create function ${FUNCTION}" |\
    xargs -n 1 -d '\t' echo |\
    egrep '^CREATE' |\
    xargs --null echo -e >> ${ARQ_SAIDA}

    echo '$$' >> ${ARQ_SAIDA}
    echo "DELIMITER ;" >> ${ARQ_SAIDA}

terça-feira, 16 de maio de 2017

MySQL - RowNum Number com GroupBy

SELECT  t1.id_ciclo_produto, t1.id_wf_produto_ciclo,
t1.cd_area_ddd, t1.cd_eot_owner, t1.cd_eot_relac,
t1.dt_cham, 
(CASE CONCAT(t1.id_ciclo_produto, t1.id_wf_produto_ciclo, t1.cd_area_ddd, t1.cd_eot_owner, t1.cd_eot_relac, t1.dt_cham) 
WHEN @cur_chave
THEN @curRow := @curRow + 1
ELSE @curRow := 0 END) + 1 AS id_tarifa,
@cur_chave := CONCAT(t1.id_ciclo_produto, t1.id_wf_produto_ciclo, t1.cd_area_ddd, 
t1.cd_eot_owner, t1.cd_eot_relac, t1.dt_cham)  AS cur_chave,
t1.vl_tarifa,
t1.nu_qtd_minutos, t1.vl_liquido,
t1.vl_pis_cofins, t1.vl_icms,
t1.vl_total
 FROM (SELECT t1.id_ciclo_produto, t1.id_wf_produto_ciclo,
t1.cd_area_ddd,
t1.cd_eot_owner, t1.cd_eot_relac,
DATE_FORMAT(t1.dt_chamada, '%Y%m') dt_cham, 
t1.vl_tarifa,
SUM(t1.nu_qtd_minutos) nu_qtd_minutos, SUM(t1.vl_liquido) vl_liquido,
SUM(t1.vl_pis_cofins) vl_pis_cofins, SUM(t1.vl_icms) vl_icms,
SUM(t1.vl_total) vl_total
 FROM tb_tmp_trafego_itx_expec_despesa_bk_smp_1 t1
GROUP BY 1,2,3,4,5,6,7) t1,
(SELECT @curRow := 0, @cur_crew_type := '') t2
;