Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Procedure

Srs eu tenho uma Procedure que eu uso para alterar o tamanho de um campo na base de dados. Eu uso ela com certa frequência para alterar campos diferentes em tabelas diferentes eu tenho que criar uma procedure para cada tabela, estou repetindo muito o código. Será que eu consigo deixa-la mais dinâmica?

DELIMITER //
CREATE PROCEDURE cr_altera_tamanho_campo_usuario()
  BEGIN
    ALTER TABLE usuarios CHANGE usuario usuario varchar(7);
  END//
DELIMITER ;
2 respostas
solução!

Boa noite Leandro,

Você está usando MySQL, certo?

Dei uma olhada na WEB e parece que há alguns comandos similares ao EXECUTE IMMEDIATE do Oracle.

Logo, algo similar ao código abaixo deve funcionar:

DELIMITER //
CREATE PROCEDURE altera_tamanho_campo_usuario (
   IN nome_tabela VARCHAR
,  IN campo VARCHAR
,  IN alteracao VARCHAR
) BEGIN
   PREPARE stmt FROM concat('ALTER TABLE ', nome_tabela, ' CHANGE ',campo, ' ', alteracao);
   EXECUTE stmt ;
   DEALLOCATE PREPARE stmt; 
END//
DELIMITER ;

Avisa aí se der certo. Se não, poste o erro.

Abraço.

Oi Rafael! Isso eu estou usando o mySql. Graças a sua ajuda eu consegui fazer o que eu queria. Vou deixar o exemplo caso alguém queria usar algo parecido. Obrigado. :)

DROP PROCEDURE IF EXISTS cr_altera_tamanho_campo;
DELIMITER //
CREATE PROCEDURE cr_altera_tamanho_campo(nomeTabela varchar(50), nomeCampo varchar(25), tamanhoCampo int)
  BEGIN    

   SET @myQuery = concat('ALTER TABLE ', nomeTabela,' CHANGE ', nomeCampo, ' ', nomeCampo, ' varchar(',tamanhoCampo,')');

    PREPARE stmt FROM @myQuery;
    EXECUTE stmt;

  END//
DELIMITER ;

DROP PROCEDURE IF EXISTS pr_remove_registro;
DELIMITER //
CREATE PROCEDURE pr_remove_registro(nomeTabela varchar(50), idUsuario int(10)) 
  BEGIN    

   SET @exec = concat('DELETE FROM ', nomeTabela, ' WHERE idUsuario = ', idUsuario);    

   PREPARE myQuery FROM @exec;
   EXECUTE myQuery; 

  END//
DELIMITER ;

CALL cr_altera_tamanho_campo('usuarios', 'usuario', 7);

SET @idUsuario = (SELECT idUsuario FROM usuarios where usuario like '%não%');   

  CALL pr_remove_registro('usuarios', @idUsuario);

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software