Terça-feira, 22 de novembro de 2005 às 14h55

MySQL 5

Faltam 0 dias! Inscreva-se agora! O maior encontro de profissionais web da américa latina.

Fala pessoal! A MySQL AB lançou no dia 24 de Outubro a versão 5.0 do MySQL. Nessa nova versão foram adicionadas novas características como: triggers, views e stored procedures. E são essas novas características que estaremos apresentando essa semana interagindo PHP e MySQL.

Vamos lá:

Primeiramente, devemos criar o nosso database.

CREATE DATABASE JULIO

Criaremos a tabela PRODUTOS, conforme descrição abaixo dentro do schema julio:

CREATE TABLE JULIO.PRODUTOS (
         COD_PRODUTO INTEGER NOT NULL AUTO_INCREMENT
        , DSC_PRODUTO VARCHAR(45) NOT NULL
        , VLR_PRODUTO DOUBLE(4,2)
        , PRIMARY KEY(COD_PRODUTO)
)
ENGINE = INNODB;

Agora "populamos" a nossa tabela.

INSERT INTO PRODUTOS (DSC_PRODUTO, VLR_PRODUTO) VALUES("CPM 22 - FELICIDADE INSTANTÂNEA", "22.00");
INSERT INTO PRODUTOS (DSC_PRODUTO, VLR_PRODUTO) VALUES("BIQUINI CAVADÃO - AO VIVO", "25.50");
INSERT INTO PRODUTOS (DSC_PRODUTO, VLR_PRODUTO) VALUES("PAPA ROACH - LOVE HATE TRAGEDY", "23.00");

Views

Uma view(visão) é uma tabela virtual na qual os dados não estão fisicamente armazenados. Ela é apenas uma visão de um grupo de colunas de uma ou mais tabelas do banco de dados. No exemplo abaixo, criaremos uma view que terá apenas as colunas COD_PRODUTO, DSC_PRODUTO.

CREATE VIEW julio.VIEW_PRODUTOS AS
         SELECT cod_produto, dsc_produto FROM produtos;

Resultado:

Stored Procedures

Conjunto de comandos SQL armazendos no servidor que realizam tarefas específicas e são ativadas como comandos. Podem receber parâmetros de entrada, saída ou entrada e saída.

DELIMITER $$
DROP PROCEDURE IF EXISTS julio.pr_total $$
CREATE PROCEDURE julio.pr_total ( OUT total INT)
BEGIN
SELECT count(0) INTO total
FROM produtos;
END $$

Executando a procedure via linha de comando

C:\ mysql -u root -p
(após teclar ENTER informe a senha do usuário root)
mysql> use julio;
mysql> call pr_total(@teste);
mysql> select @teste;

Depurando:

use julio - Informamos o database que iremos utilizar.
call pr_total(@teste) -
Chamamos a procedure pr_total e armazenamos o resultado em teste.
select @teste -
Exibimos o resultado. No exemplo acima, trazemos a quantidade de produtos cadastrados.

Triggers

É um bloco PL/SQL armazendo em um banco de dados.e executado sempre que o evento ocorrer. Esse evento pode ser um DML (update, insert, delete) , um DDL (create, alter, drop, truncate table) ou mesmo um evento ocorrido do banco, como uma conexão, por exemplo.

Criaremos a tabela HISTÓRICO que armazenará todas as alterações de valores efetuadas na tabela de PRODUTOS.

CREATE TABLE julio.historico (
             COD_HIST INTEGER NOT NULL AUTO_INCREMENT
             , COD_PRODUTO INTEGER NOT NULL
             , DT_ALTERACAO DATE NOT NULL
             , VLR_ANTIGO DOUBLE(4,2) NOT NULL
             , VLR_NOVO DOUBLE(4,2) NOT NULL
             , FOREIGN KEY(COD_PRODUTO) REFERENCES
produtos(COD_PRODUTO)
             , PRIMARY KEY(COD_HIST)
             )
ENGINE = INNODB;

Abaixo, a trigger TR_PRODUP que será acionada quando ocorrer um UPDATE na tabela de PRODUTOS.

DELIMITER $$
DROP TRIGGER julio.tr_produp $$
CREATE TRIGGER tr_produp BEFORE UPDATE ON produtos
FOR EACH ROW
BEGIN
    DECLARE TESTE VARCHAR(30);
    DECLARE DATA DATE;
    SET DATA = NOW();
INSERT INTO HISTORICO SET COD_PRODUTO = OLD.cod_produto
               , VLR_ANTIGO = OLD.vlr_produto
               , VLR_NOVO = NEW.vlr_produto
               , DT_ALTERACAO = DATA;
END $$

Após alterarmos algum dado na tabela produtos é disparado a trigger tr_produp que fará automaticamente uma inserção na tabela de histórico.

Para testarmos, alterarei o valor do CD do CPM 22, de R$ 22,00 para R$ 25,00.

UPDATE produtos SET vlr_produto = 25.00 WHERE cod_produto = 1;

Após a atualização, se dermos um SELECT na tabela HISTÓRICO teremos como resultado:

SELECT * FROM historico;

Chamando Stored Procedures em MySQL com PHP

Nesse exemplo, utilizarei o PHP 5.0 e Apache 1.3.38. Antes de começarmos, devemos efetuar uma pequena alteração no arquivo php.ini.

Utilizaremos em vez da extensão mysql a extensão mysqlqi que nos dá acesso a outras funcionalidades do MySQL à partir da versão 4.1.

Editando php.ini

Adicionar a seguinte linha: extension=php_mysqli.dl

Arquivo: call.php

<?
//CONECTA AO MYSQL
$conn = mysqli_connect("127.0.0.1","usuario","senha");

//VERIFICA SE OCORREU ALGUM ERRO
if (mysqli_connect_errno()) {
    echo "Erro na conexão!";
exit();
}

//SELECIONA O BANCO DE DADOS
mysqli_select_db ($conn,"julio");

//EXECUTA A QUERY
if ($result = mysqli_query($conn,"CALL pr_total(@teste)")) {
    if ($result = mysqli_query($conn,"SELECT @teste")) {
        $row = mysqli_fetch_array($result);
        echo "Total de produtos cadastrados ........: ".$row[0];
    } //FECHA IF
} //FECHA IF
?>

Resultado:

Dicas:

É muito cansativo e demorado executar todos os comandos em linha de comando. Para isso foram criados aplicativos que visam facilitar esse trabalho. Abaixo apresento o MySQLAdministrador e o Query Browser que otimizam em muito a nossa vida.

MySQL Administrator (essencial para o DBA)

Interface para administração do banco de dados MySQL.. Backups, log de erro etc...

Download: http://www.mysql.com

Query Browser

Aplicativo para criar, executar e otimizar comandos SQL. Podemos ainda criar e deletar tabelas.

Download: http://www.mysql.com

Links úteis:
http://www.php.net/manual/pt_BR/ref.mysqli.php

Para baixar os exemplos desse artigo, clique aqui!

Semana que vem tem mais. Espero que vocês tenham gostado! Não deixe de nos enviar críticas ou sugestões para o próximo assunto, afinal a coluna é de vocês.

Boa semana a todos! Até mais!

10 comentários

 Domirélio Ferreira Moreira
22/11/2005 21h57

Excelente!

Muito bom Júlio, com essas novas características a MySQL ficou muito boa. Eu só gostaria de saber o seguinte, isso fará com que o acesso a Base de Dados fique mais lenta? Um abraço!

 Cristiano Freire Moura
24/11/2005 18h26

Erro Truncate

amigo porque qdo eu insiro um valor em branco em campo integer ou float da erro truncate

e um exemplo se uso o mysql 5 em casa e qdo eu jogar no servidor for 4 vai dar algum erro.. como faço?

 Danilo Gomes
28/11/2005 16h21

Usuarios

Queria saber se existe uma quantidade maxima de usuarios simultaneos para que o MySQL deixe de ser free? E queria saber se ele se trabalha bem com o Visual Basic?

 Helton Eduardo Ritter
21/12/2005 15h11

Chaves estrangeiras

Cara, sugestão, como o Mysql não tem integridade podia montar um exemplo com duas tabelas e fazer uma Trigger para ele não deixar excluir da tabela se houvese dependências.

parabéns pela coluna!

 Paulo Ronaldo Vilela de Lima Jr
05/01/2006 09h52

MYSQL 5

AMIGO, TEM COMO VC ME PASSAR UM EXEMPLO.
1)COMO FAZER UMA PROCEDURE COM VARIOS PARAMETROS DE ENTRADA. E COMO FAZER PARA PEGAR O RESULTADO DESSE SELECT E COMO PASSAR ESSES PARAMETROS EM PHP PARA CHAMAR A PROCEDURE
2) COMO FAZER UMA PROCEDURE DE INSERT COMO VARIOS PARAMETROS DE ENTRADA. E COMO PASSAR ESSES PARAMENTROS E
M PHP PARA ESSA PROCEDURE


GRATO

 diego
23/01/2006 23h32

Apagando dados

Amigo em um tutorial sobre login vcs ensinaram a cadastrar, realizar o login mais, sou novo em php e tava querendo uma explicaçao de como deletar usuarios obrigado

 julio coronel
14/02/2006 00h24

Tutorial perfeito!!!

Parabéns pelo tutorial, perfeito, cheio de detalhes e muito mais, testei e funcionou perfeitamente! Muito obrigado por nos passa um pouco do seu conhecimento, pois só assim crescemos como ser humano, e não esquecemos dos iniciantes, por que um dia todos nós tivemos um começo. Forte Abraço e muita energia positiva xará!!

 erivelto carvalho
27/03/2006 09h52

procedure?

ai. aonde eu coloco a procedure para ser executada?não entendi o
DELIMITER$$
.
.
.
.

 Leandro Zavitoski Galassi
25/04/2006 19h07

Mesmo erro que >> Cristiano Freire Moura

Olá pessoal, estou com o mesmo problema descrito no post do "Cristiano Freire Moura, 24/11/2005 18:26", tenho que declarar a variável com valor = "0"? ou alguem saberia me ajudar com outra solução? Valeu!

 Guilherme Santos Sá
12/06/2006 09h10

Variavel

òtimo, mas como faço para passar uma variavel do php para a procedure ou trigger?!?!

Cancelar resposta

Qual a sua opinião?

Faça login abaixo ou cadastre-se rapidamente.


Sobre o Autor
Júlio César Martini atualmente presta serviços de WebMaster/Programador para o UOL (http://www.uol.com.br), Graduado em Tecnólogo em Informática pela UNIFIAN - Faculdades Anhanguera e Pós-Graduado em Desenvolvimento de Software para Web pela UFSCAR. Foi o primeiro profissional a chegar à marca de 100 artigos publicados no iMasters e trabalha com PHP desde 2000. Site: http://www.juliocesarmartini.com
3G

2001 - iMasters FFPA Informática Ltda - Todos os direitos reservados.