Ir para conteúdo
Fórum Script Brasil

Denis Courcy

Moderadores
  • Total de itens

    3.089
  • Registro em

  • Última visita

Posts postados por Denis Courcy

  1. Crie uma procedure e passe os parâmetros necessários.

    DELIMITER $$
    
    USE `meuBancoDeDados`$$
    
    DROP PROCEDURE IF EXISTS `minhaProcedure`$$
    
    CREATE PROCEDURE `minhaProcedure`(IN DataEmissao DATE)
    BEGIN
       SELECT DATA_EMIS, NRNF, TOTAL_VENDA
       FROM nf
       WHERE DATA_EMIS = DataEmissao;
    END$$
    
    DELIMITER ;

     

  2. Basicamente é isso aqui:

    TRIGGER `tguDelete` AFTER DELETE ON `locacoes` 
    FOR EACH ROW 
    BEGIN
       DECLARE qtd SMALLINT UNSIGNED DEFAULT 0;
       SET qtd = (SELECT COUNT(id_locacao) FROM locacoes WHERE codigo_filme = OLD.codigo_filme);
       IF qtd = 1 THEN
          UPDATE filmes SET situacao = 'Disponivel' WHERE id_locacao = OLD.id_locacao;
       END IF;
    END;

     

  3. Verifique se a tabela empresas possui indices para os campos id e razão (um índice para cada campo)
    tabela clientes_old possui indices para campos id_emp,opcao,ano,mes,dia (um indice para todos estes campos)
    Se a tabela clientes_old for muito grande, verifique, também, se há indice para o campo nome 
    tabela clientes_old possui indices para campos id_emp,setor,exame_clinico,opcao,ano,mes,dia (um indice para todos estes campos)
    tabela empresas_setores id,setor,funcao (um indice para todos estes campos)

     

    Rode cada um dos selects, dentro do phpadmin ou outro sgbd, com a palavra EXPLAIN antes da palavra SELECT e poste o resultado se as ações acima não melhorarem o tempo de execução de seu relatório.

  4. Boa tarde Ricardo,

    Não há relacionamentos explícitos quando engine é MyISAM. 

    O engine utilizado para manter integridade referencial é o InnoDB.

    O banco information_schema é virtual, e proprietário do MySQL. É montado quando do start do MySQL. 

    As informações de relacionamentos de todos os bancos de seu MySQL estão na tabela TABLE_CONSTRAINTS do banco information_schema.

     

  5. Basicamente é isso:

    DELIMITER $$
    
    CREATE PROCEDURE `nomedobanco`.`ATUALIZA_ESTOQUE_ENTRADA`(IN RCODENTRADA INTEGER)
    BEGIN
       DECLARE VCODENTRADA INTEGER;
       DECLARE VCODOBRA INTEGER;
       DECLARE VCODPROD INTEGER;
       DECLARE VQTDE FLOAT;
       DECLARE VVRUNITARIO NUMERIC(15,2);
       
       DECLARE VCODCLIENTE INTEGER;
       DECLARE VSTATUS VARCHAR(20);
       DECLARE VTIPO CHAR(1);
    
       DECLARE done INT DEFAULT FALSE;
       DECLARE cur1 CURSOR FOR SELECT I.codentrada, I.codobra, I.codproduto, I.quantidade, I.vrunitario
         FROM ITENSENTRADA I 
         WHERE I.codentrada = RCODENTRADA;
       DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
       
       OPEN cur1;
       FETCH cur1 INTO VCODENTRADA, VCODOBRA, VCODPROD, VQTDE, VVRUNITARIO;
       WHILE NOT done DO
          SET vtipo = 'E';
     
            SELECT E.codcliente, e.status INTO vcodcliente, vstatus
            FROM ENTRADA e
            WHERE E.codentrada = rcodentrada;
     
            IF NOT (vstatus = 'ABERTA' OR vstatus = 'FINALIZADA') THEN
               UPDATE entrada e
               SET e.status = 'FINALIZADA'
               WHERE E.codentrada = rcodentrada;
     
               UPDATE PRODUTO P SET
               P.estoque = P.estoque + vqtde,
               P.vrunitario = vvrunitario
               WHERE P.codproduto = vcodprod;
     
               INSERT INTO HISTORICOCLIENTES(CODMOV, CODCLIENTE, CODPRODUTO, QTDE, CODOBRA, TIPO) VALUES (vcodentrada, vcodcliente, vcodprod, vqtde, vcodobra, vtipo);
               INSERT INTO HISTORICOPRODUTO (CODMOV, CODOBRA, CODCLIENTE, CODPROD, QTDE, VALOR, TIPO) VALUES (vcodentrada, vcodobra, vcodcliente, vcodprod, vqtde, vvrunitario, vtipo);
            END IF;
            FETCH cur1 INTO VCODENTRADA, VCODOBRA, VCODPROD, VQTDE, VVRUNITARIO;
       END DO;
    END$$

     

  6. 4 horas atrás, Fabricio_wm disse:

    Eu fiz isso e no de insert deu erro 1064 e 1193.
    Unknown system variable cpf

    Mostra a estrutura da tabela interditado

    4 horas atrás, Fabricio_wm disse:

    Eu esqueci de mencionar que a outra trigger para descriptografar é para exibir.
    Deu o mesmo erro.

    Neste caso não é trigger. É select.

  7. Faça assim:

    CREATE TRIGGER Crypt_Decrypt
    before insert on interditado
    FOR EACH ROW
    begin
      SET NEW.nome := aes_encrypt(NEW.nome, 'MIICeQIBADANBgkqhkiG9w0BAQEFAASC');
      SET NEW.cpf := aes_encrypt(NEW.cpf, 'MIICeQIBADANBgkqhkiG9w0BAQEFAASC');
      SET NEW.nome_pai := aes_encrypt(NEW.nome_pai, 'MIICeQIBADANBgkqhkiG9w0BAQEFAASC');
      SET NEW.nome_mae := aes_encrypt(NEW.nome_mae, 'MIICeQIBADANBgkqhkiG9w0BAQEFAASC');
    end;

    Crie outro trigger para before update, igual a este.

  8. O trigger de insert não tem valores antigos (OLD)

    O trigger de delete não tem valores novos (NEW)

    O que você precisa é de um trigger que ocorra antes de um update. (before update) Onde voce poderá comparar valores novos e antigos.

    Deverá ser BEFORE pois a comparação deve ocorrer antes da gravação. Depois disso não haverá valores NEW.

    DELIMITER $$
    
    CREATE TRIGGER `nomedobanco`.`meutriggerdeupdate` BEFORE UPDATE
    ON `meubanco`.`minhatabela`
    FOR EACH ROW BEGIN
        IF NEW.natureza <> OLD.natureza THEN
           grave aqui
        END IF;
    END$$
    
    DELIMITER ;

     

×
×
  • Criar Novo...