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!

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!
Responder comentário
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?

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?
Responder comentário
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!

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

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
Responder comentário
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á!!
Responder comentário
ai. aonde eu coloco a procedure para ser executada?não entendi o
DELIMITER$$
.
.
.
.

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!
Responder comentário
òtimo, mas como faço para passar uma variavel do php para a procedure ou trigger?!?!
Responder comentárioOs textos publicados neste espaço são de responsabilidade única de seus autores (colunistas e leitores) e podem não expressar necessariamente a opinião do iMasters.
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
2001 - iMasters FFPA Informática Ltda - Todos os direitos reservados.