Sie sind auf Seite 1von 6

Stored procedures, triggers e views no MySQL 5

CAPA

Truques com dados


Mostramos como alguns novos recursos do MySQL 5 ajudaro a melhorar o desenho de programas e melhoraro muito o desempenho dos aplicativos. por Larkin Cunningham

Alfonso Romero www.sxc.hu

sistema de bancos de dados de cdigo aberto MySQL serve muitas das maiores empresas no mundo, como Yahoo e Ticketmaster. Tambm est presente num grande nmero de websites com trfego intenso, como a Wikipdia. Diversas organizaes, no entanto, tradicionalmente preterem o MySQL em troca de sistemas de bancos de dados comerciais ricos em recursos, como o Oracle e o DB2. A partir do MySQL 5 [1], os desenvolvedores do MySQL comearam a introduzir uma gama de recursos prossionais que acabaro tornando-o mais competitivo com sistemas de bancos de dados comerciais. Este artigo examina alguns dos recursos prossionais agora presentes no MySQL. Muitos deles foram introduzidos na verso 5.0, e alguns podem vir a s-lo na verso 5.1, que ainda estava em fase beta durante a confeco deste artigo, mas possivelmente j ter sido lanado quando voc o ler. Neste artigo foi usada a verso 5.1.9-beta para confeco dos exemplos. Trs dos novos recursos mais atraentes no MySQL 5.x so os stored procedures (procedimentos armazenados), triggers (gatilhos), e views (visualizaes). Esses recursos no so novos na indstria. A Oracle, por exemplo, primeiro apresentou o PL/SQL [2], sua implementao de uma linguagem procedural para SQL, em 1991. O Sybase, PostreSQL e DB2 esto entre os outros sistemas de gerenciamento de bancos de dados com linguagens procedurais para SQL. Todavia, triggers, views

As stored procedures so uma ferrae stored procedures ainda so uma adio menta poderosa para um desenvolvedor muito bem vinda ao MySQL. Deve-se notar que alguns desses recur- ter em seu arsenal. Elas podem oferesos prossionais do MySQL ainda esto cer grandes benefcios em termos de em estgio inicial de desenvolvimento. desempenho e desenho de aplicaes. Muitos desses recursos ainda esto incom- Em relao ao desempenho, possvel pletos ou no atingem nveis timos de reduzir muito trfego de rede realizandesempenho. A verso 5.1 resolveu algu- do um maior processamento de dados mas dessas questes, e os novos recursos dentro do banco de dados. Ao reduzir o sem dvida continuaro melhorando nas trfego de rede, pode-se eliminar a latnverses mais novas do MySQL. cia associada comunicao do servidor Ao longo deste artigo, haver refern- de aplicao com o servidor de banco cias s tabelas produtos, cabecalhos_pedi- de dados, principalmente quando eles dos, linhas_pedidos, estoque e clientes, residem em servidores separados, como para melhor ilustrar os exemplos. O o caso na maioria das aplicaes de Exemplo 1 mostra os comandos SQL grande escala. Com stored procedures, possvel create table que criam as tabelas. Ao dar exemplos de stored procedures, triggers e usar uma abordagem de caixa preta para views, sero feitas referncias s tabelas o desenho e desenvolvimento de aplicado Exemplo. es. Um desenvolvedor programando em Java, PHP, Ruby ou qualquer outra linguagem com suporte ao MySQL no precisa ter grandes conhecimentos em Antes de explicar o que so stored procedu- SQL ou PL/SQL. Em equipes de deres, importante explicar que esse termo senvolvimento com diversos membros, ser usado aqui geralmente em refern- pode-se ter desenvolvedores de stored cia combinao de stored procedures e procedures concentrados no desenvolstored functions (funes armazenadas). vimento de stored procedures, enquanto Uma stored procedure aceita mltiplos desenvolvedores de Java, PHP ou Ruby parmetros de entrada e sada. Uma stored se dedicam a suas linguagens de profunction tambm aceita mltiplos par- gramao especcas. Contanto que metros de entrada, mas retorna somente cada desenvolvedor esteja ciente das um nico valor a quem a chamou. Essa entradas e sadas esperadas, ambos os restrio permite o uso de stored func- desenvolvedores podem trabalhar em tions dentro de comandos SQL, o que paralelo. Essa pode ser uma forma de efetivamente proporciona uma extenso utilizar melhor os conhecimentos de das capacidades do SQL. seus desenvolvedores, caso o projeto

Stored procedures

36

http://www.linuxmagazine.com.br

MySQL 5 | CAPA

Triggers

seja grande o suciente para garantir tabela associada arquivo_produtos com as os recursos de desenvolvimento. mesmas colunas da tabela de produtos. A portabilidade tambm favorecida Para arquivar automaticamente, voc por um maior desenvolvimento da sua criaria triggers na tabela dos produtos lgica no banco de dados. Seria possvel, para inserir uma linha na tabela arquipor exemplo, desenvolver um programa vo_produtos aps cada atualizao ou re- O MySQL 5 oferece uma linguagem em lote escrito em C, um aplicativo web moo. Voc no deve criar um trigger procedural que voc pode usar para usando Ruby on Rails, e um web service que seja acionado aps uma insero, pois criar suas stored procedures e triggers. em Java, e todos utilizarem o mesmo ao buscar todo o histrico de um produ- Ao invs de usar uma linguagem proceto, seria retornada a unio da linha da dural baseada em C ou Python, os deconjunto de stored procedures. A abordagem de vrias pessoas ao tabela produtos com as linhas associadas senvolvedores do MySQL criaram uma linguagem procedural de acordo com o desenvolver aplicativos que usem um da tabela arquivo_produtos. A abordagem semelhante quando padro ANSI SQL:2003 [5]. O padro banco de dados relacional ou embutir todo o SQL dentro de seu cdigo, ou em- a auditoria necessria. Em vez de ter ANSI usado em diferentes graus pelos butir todo o SQL em stored procedures uma tabela de arquivamento associada desenvolvedores de outros sistemas gee simplesmente cham-las a partir de nos locais que precisam de arquivamento, renciadores de bancos de dados, ento, seu cdigo. Muitos desenvolvedores se possvel ter uma nica tabela de audi- ao seguir o padro, os conhecimentos baseiam em mapeadores objeto-relacio- toria. Para as tabelas para as quais voc adquiridos no desenvolvimento de stonais como o Hibernate [3] (para Java) e desejar manter uma trilha de atividades red procedures e triggers para o MySQL o ActiveRecord [4] (para Ruby on Rails), de auditoria, voc pode ter triggers acio- transfervel a outros bancos de dados onde stored procedures so altamente ir- nados aps qualquer operao de adio, como Oracle, DB2 e PostgreSQL, que relevantes. Decidir qual abordagem usar atualizao ou remoo. Esses triggers possuem implementaes semelhantes para lidar com o processamento dos dados inseririam uma linha na tabela de au- de linguagens procedurais. Assim como as linguagens de pronas suas aplicaes depender de fatores ditoria contendo a natureza da ao, a como desempenho e portabilidade. Se tabela afetada, o usurio que realizou a gramao com as quais voc deve ter o desempenho no for importante, voc operao, a hora em que isso foi realizapode considerar um mapeador objeto-re- do e quaisquer outros dados que se julgar Exemplo 1: O esquema lacional para gerar seu SQL dinamica- importantes. A abordagem de usar triggers mente. Mas, se voc se importar com o no banco de dados para auditoria e no do banco de dados desempenho e tiver necessidade de um no cdigo da sua aplicao pode reduzir 01 CREATE TABLE produtos ( certo nmero de transaes por segundo, o trabalho de programao de seus desen02 id MEDIUMINT NOT NULL AUTO_INCREMENT, ou de um tempo de resposta em deter- volvedores e encorajar a consistncia em 03 nome CHAR(40) NOT NULL, 04 custo DOUBLE(9,2) UNSIGNED DEFAULT 0.0, minado nmero de milissegundos, voc ambientes onde diversas aplicaes aces05 PRIMARY KEY (id) provavelmente ter interesse nos mritos sam o mesmo banco de dados. Existem 06 ); do uso de stored procedures. Se voc tra- muitas boas abordagens para a auditoria 07 balha em um ambiente heterogneo com que podem ser empregadas no cdigo da 08 CREATE TABLE estoque ( muitas plataformas de desenvolvimento, sua aplicao, ento cada caso deve ser 09 id MEDIUMINT NOT NULL AUTO_INCREMENT, ento as stored procedures podem ser examinado em seu contexto. 10 id_produto MEDIUMINT NOT NULL, 11 quantidade MEDIUMINT NOT NULL DEFAULT 0, uma forma de voc desenvolver sua l12 PRIMARY KEY (id) gica de processamento de dados s uma 13 ); vez e numa localizao central. Anal, as 14 stored procedures no se importam com Uma view uma tabela virtual gerada a 15 CREATE TABLE cabecalhos_pedidos ( partir de uma consulta armazenada. A a linguagem que faz a chamada. 16 id MEDIUMINT NOT NULL AUTO_INCREMENT, 17 id_cliente MEDIUMINT NOT NULL, consulta armazenada freqentemente 18 data_pedido DATETIME NOT NULL, composta por mltiplas operaes de 19 status_pedido CHAR(1) DEFAULT O, join que usam dados de diversas tabelas 20 PRIMARY KEY (id) Os triggers tm muitos usos, incluindo com algumas condies em comum. 21 ); tarefas bsicas de manuteno, como au- Num nvel mais simples, pode ser s um 22 23 CREATE TABLE linhas_pedidos ( ditoria e arquivamento. Eles podem ter subconjunto de uma tabela maior. Um 24 id MEDIUMINT NOT NULL AUTO_INCREMENT, diversos outros usos tambm. Um cenrio exemplo trivial, novamente usando a ta25 id_pedido MEDIUMINT NOT NULL, comum quando um trigger aciona- bela produtos, criar uma view chamada 26 id_produto MEDIUMINT NOT NULL, do aps uma linha ser criada, como por produtos_sem_estoque, que une a tabela 27 quantidade MEDIUMINT NOT NULL DEFAULT 0, exemplo a adio de uma linha tabela produtos tabela estoque, nos itens com 28 PRIMARY KEY (id) 29 ); linhas_pedidos. Um trigger poderia ser estoque zero. 30 As views podem ajudar a reduzir o acionado depois de a linha ser inserida 31 CREATE TABLE clientes ( para atualizar a quantidade do produto cdigo SQL para conjuntos de dados 32 id MEDIUMINT NOT NULL AUTO_INCREMENT, em estoque na tabela estoque. freqentemente acessados. As views 33 nome VARCHAR(70) NOT NULL, Onde o arquivamento necessrio, tambm melhoram a ecincia, pois a 34 endereco VARCHAR(200) NOT NULL, 35 telefone VARCHAR(20) NOT NULL, pode-se ter mais uma tabela de arquiva- consulta respectiva pode sofrer cache e 36 email VARCHAR(40) NOT NULL, mento para cada tabela, onde se guardar ser carregada mais rpido que as diver37 PRIMARY KEY (id) a informao sobre os arquivamentos. Por sas verses da mesma consulta rodando 38 ); exemplo, a tabela produtos pode ter uma a partir de diferentes locais.

Linguagem procedural do MySQL

Sobre views

Linux Magazine #23 | Setembro de 2006

37

CAPA | MySQL 5

Figura 1

uma quantidade a ser adicionada ao estoque. Como o delimitador padro no MySQL um ponto-e-vrgula, e a linguagem procedural do MySQL utiliza esse caractere para terminar cada comando, precisamos mandar o MySQL mudar o delimitador ao tentarmos criar nossa procedure. A conveno normal usar como delimitador dois cifres seguidos, Uma stored procedure simples no navegador de consultas do MySQL. com o comando DELIMITER $$ (linha 1). O intimidade, como PHP e Java, a lin- prximo comando (linha 3) manda o guagem procedural do MySQL pos- MySQL destruir a stored procedure de sui as estruturas de que voc precisa mesmo nome, caso exista uma. Caso para escrever cdigos teis. Isso in- contrrio, esse comando ignorado e clui comandos condicionais (IF-THEN- o parser MySQL continua processando ELSE e CASE-WHEN) e comandos iterativos os comandos. A linha 4 faz o MySQL (REPEAT-UNTIL e WHILE-DO). criar uma nova stored procedure com O comprimento deste artigo no nos o nome e parmetros fornecidos. Toda permite apresentar todos os recursos a lgica das stored procedures comea da linguagem procedural do MySQL. com o comando BEGIN (linha 7). Vrios Em vez disso, ser explicado como as comandos declarativos, seqenciais, stored procedures e triggers do MyS- condicionais e iterativos podem ser QL so estruturados e oferecem alguns usados antes de terminar a lgica da exemplos simples que mostram, ainda stored procedure com o comando END que basicamente, o que as stored pro- (linha 26). Note como o comando END cedures, triggers e views realmente so. seguido de nossos delimitadores temSe voc for um programador experien- porrios, os dois cifres. Isso acontece te em qualquer linguagem moderna, porque agora deixamos a stored proa linguagem procedural do MySQL cedure e voltamos a parsear o SQL do parecer bastante simplista. Ela foi MySQL normalmente. Nesse ponto, pensada como uma forma de oferecer vamos voltar ao delimitador padro de entrada a comandos SQL e manipu- ponto-e-vrgula (linha 28). lar seus resultados, e no como uma linguagem para competir com outras como PHP ou Java.

Variveis, parmetros e tipos de dados


Na informam ao MySQL que o parmetro pode receber um valor de entrada, retornar um valor a quem o chamou, ou ambos (declarando que um parmetro IN OUT). Os parmetros podem ser usados como variveis normais, mas somente os OUT devem ter seus valores mudados na procedure. As variveis tm que ser explicitamente declaradas e receber um tipo e um valor padro opcional. Os tipos a escolher pertencem aos tipos de dados SQL padro que o MySQL suporta para colunas de tabelas. Todos os tipos de dados so escalares, ou seja, s podem guardar um nico valor discreto. Isso elimina tipos de dados como vetores, que podem ser frustrantes para os desenvolvedores acostumados com linguagens como PHP e Java. Entretanto, h formas de contornar isso, como tabelas temporrias que usam um mecanismo de armazenamento em memria. Alguns dos tipos de dados tpicos incluem CHAR e VARCHAR (para caracteres e strings), DATE, DATETIME, INT (incluindo TINYINT, SMALLINT, MEDIUMINT e BIGINT), DECIMAL, FLOAT, DOUBLE e outros. Grandes quantidades de dados podem ser armazenadas usando-se outros tipos de dados, como TEXT (at 64 KB) e BLOB (grande objeto binrio teoricamente possvel armazenar at 4 TB em um LONGLOB).
adicao_maxima (linha 8) e trs parmetros adicao_estoque, id_produto e novo_estoque (linhas 4 a 6). As palavras-chave IN e OUT
gura 1,

declaramos uma varivel

Estrutura de uma stored procedure


As stored procedures so escritas de forma a permitir que sejam criadas por qualquer ferramenta que execute SQL. Alguns dos exemplos aqui so mostrados no navegador de consultas do MySQL [6], uma ferramenta livre e muito til do MySQL. Elas so escritas como scripts SQL, que basicamente informam ao MySQL o nome e os contedos da stored procedure. Se ela contiver erros, o MySQL informar o desenvolvedor quando este tentar cri-la. A gura 1 mostra uma stored procedure que aceita um valor inteiro para

Figura 2 Uma procedure feita para retornar um conjunto de resultados a quem a chamou.

38

http://www.linuxmagazine.com.br

MySQL 5 | CAPA

Exemplo 2: Uma stored procedure com uso de um cursor


01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 DELIMITER $$ DROP PROCEDURE IF EXISTS mostrar_pedidos_processados $$ CREATE PROCEDURE mostrar_pedidos_processados () BEGIN DECLARE DECLARE DECLARE DECLARE DECLARE DECLARE v_p_id v_c_nome v_c_telefone v_p_data v_p_total nao_encontrado MEDIUMINT; VARCHAR(70); VARCHAR(20); DATETIME; DOUBLE(9,2); TINYINT;

Figura 3 Exemplo de chamada de stored procedure em PHP usando mysqli.

SQL em stored procedures


Diferentemente de outras linguagens de programao, como PHP e Java, no existem drivers com os quais se preocupar, nem funes ou mtodos especiais para executar seu SQL. No lugar disso, os comandos SQL podem ser executados dinamicamente e os resultados inseridos diretamente das variveis. Os comandos UPDATE e INSERT podem ler valores diretamente das variveis e parmetros. Na gura 1, um comando UPDATE (linha 12) mistura nomes de tabelas, de colunas e parmetros. No comando SELECT seguinte (linha 16), um valor selecionado e enviado diretamente para um parmetro OUT. Como j foi dito, a linguagem procedural do MySQL , no nal das contas, uma forma de entrar dados em SQL e processar os resultados. No comando SELECT (linha 16), na gura 1, um valor foi selecionado e enviado para um parmetro OUT. Supondo que a coluna id garanta que cada dado nico, isso no deve ter problemas. Mas e se o comando SQL retornar vrios valores? Voc s deve selecionar algo e enviar para uma varivel se tiver certeza absoluta de que somente um valor ser retornado. Esse ser o caso quando o discriminador (os argumentos aps a palavra-chave WHERE) usar uma chave nica, como uma coluna de id usando um auto_increment, ou quando voc selecionar enviar o valor de uma funo

para uma varivel, com SUM() ou MAX(), por exemplo. Como as variveis so escalares e s conseguem guardar valores unitrios, eliminada a possibilidade de se retornar uma lista de valores diretamente para uma varivel. a que o conceito de cursores chega para ajudar.

/* Selecionar todos os pedidos processados */ DECLARE resumo_pedido_atual CURSOR FOR SELECT oh.id , c.nome , c.telefone , oh.data_pedido , SUM(p.custo * ol.quantidade) AS custo_total FROM produtos p , clientes c , cabecalhos_pedidos oh , linhas_pedidos ol WHERE c.id = oh.id_cliente AND oh.id = ol.id_pedido AND ol.id_produto = p.id AND oh.status_pedido = P GROUP BY oh.id , c.nome , c.telefone , oh.data_pedido; DECLARE CONTINUE HANDLER FOR NOT FOUND SET nao_encontrado = 1; SET nao_encontrado = 0; OPEN resumo_pedido_atual; laco_resumo_pedido:REPEAT FETCH resumo_pedido_atual INTO v_p_id , v_c_nome , v_c_telefone , v_p_data , v_p_total; IF nao_encontrado THEN LEAVE laco_resumo_pedido; END IF; SELECT CONCAT(ID do pedido: , v_p_id, , Nome: , v_c_nome, , Telefone: , v_c_telefone, , Data do pedido: , v_p_data, , Total do pedido: , v_p_total); UNTIL nao_encontrado END REPEAT laco_resumo_pedido; CLOSE resumo_pedido_atual; END $$ DELIMITER ;

Um cursor um ponteiro para um conjunto de resultados retornados por uma consulta SELECT. Embora seja usado principalmente quando esse tipo de consulta retorna mais de uma linha, tambm possvel usar um cursor mesmo quando somente uma linha retornada. Mesmo que nenhuma linha seja retornada, isso no gerar um erro. Porm, se tentarmos buscar uma linha de um resultado nulo ou se tentarmos buscar alm da ltima linha dos resultados, um erro do MySQL ser relatado. O exemplo 2 mostra uma forma possvel para se utilizar cursores com REPEAT-UNTIL. Comeamos a procedure declarando algumas variveis padro, incluindo uma com o nome de nao_encontrado. Essa varivel usada junto com um HANDLER para a condio NOT FOUND (NO ENCONTRADO). Ou seja, quando uma condio NOT FOUND for encontrada, como por exemplo quando o cursor ultrapassa seus limites, o valor de nao_encontrado ser denido como 1 ou TRUE. Nosso cursor resumo_pedido_atual, no nada mais que um valor dado a uma varivel de mesmo nome at que consigamos abri-la

Cursores

Linux Magazine #23 | Setembro de 2006

39

CAPA | MySQL 5

Figura 4 O SQL para criar a view.

Figura 5 Uso de uma view como uma consulta normal.

com OPEN. Aps a abertura, podemos comear buscando nosso cursor e enviando-o a variveis na mesma ordem das colunas no comando SELECT do cursor. Para buscar todas as linhas retornadas pela nossa consulta de seleo, precisamos usar um comando iterativo. Existem muitas formas de fazer isso, e uma delas REPEAT-UNTIL. Apesar de o nosso comando REPEAT continuar AT (UNTIL) uma condio especca ser verdadeira (a varivel nao_encontrado, no caso), ns temos a opo de sair (LEAVE) da iterao antes que a condio UNTIL seja atingida. Para isso, usamos um rtulo para a iterao, laco_resumo_pedido. Isso nos permite sair da iterao antes de usar alguma das variveis buscadas, as quais, no caso de buscar alm da ltima linha, resultar num erro do MySQL. O comando SELECT CONCAT pode parecer um pouco estranho, mas como exibimos os valores retornados pela consulta do nosso cursor.

Retornar conjuntos de resultados


Se voc for um programador experiente que usa algo como PHP, Java, Python ou Ruby, pode estar se perguntando qual o objetivo de uma stored procedure como a do exemplo 2, j que ela s mostra o resultado no console ou no navegador de consultas

do MySQL. Ela no muito til se voc quiser manipular os dados do conjunto de resultados do cursor. Porm, possvel retornar um conjunto de resultados ao programa que o gerou sem o cursor ou o cdigo de manipulao. Um comando SQL simples pode ser colocado numa stored procedure sem declarar um cursor e sem realizar um SELECT para alguma varivel. Ele escrito exatamente como voc o escreveria, caso fosse executar seu SQL no navegador de consultas do MySQL ou no phpMyAdmin [7]. No exemplo 2, voc pode simplesmente abandonar todos os comandos entre BEGIN e END que no sejam a consulta SQL. A gura 2 mostra essa pequena stored procedure. Note como agora a stored procedure foi mudada para receber um parmetro para selecionar pedidos de um status especco. Essa procedure ordenada pode potencialmente retornar o conjunto de resultados da consulta para um programa, supondo que a linguagem de programao desse programa suporte a busca desses conjuntos de resultados sem limites xos. possvel ter mltiplas consultas SQL como a da gura 2. Isso pode ser til para conjuntos de dados relacionados, porm, melhor car longe dessa abordagem e usar consultas nicas que retornem conjuntos de dados nicos.

Chamada de uma stored procedure


A gura 2 mostra um exemplo de cdigo de chamada de uma stored procedure em PHP. No MySQL 5, deve-se ter instalada a extenso mysqli, para orientao a objetos, carregada ou compilada no PHP. A gura 3 mostra as chamadas de mtodos usando o mysqli. A linha 10 demonstra a chamada stored procedure. Note que ela no parece ser diferente de uma chamada SQL comum. A diretiva while na linha 21 itera atravs das linhas no conjunto de resultados retornado, assim como um conjunto de dados retornado a partir da execuo de uma consulta SQL normal.

Exemplo 3: Um trigger simples ps-atualizao


01 02 03 04 05 06 07 08 09 DELIMITER $$ CREATE TRIGGER trg_ins_linhas_pedidos AFTER UPDATE ON linhas_pedidos FOR EACH ROW BEGIN UPDATE estoque SET quantidade = quantidade - NEW.quantidade WHERE id_produto = NEW.id_produto; END $$ DELIMITER ;

Enquanto as stored procedures so iniciadas por chamadas diretas de acordo com sua necessidade, os triggers, por outro lado, so iniciados por eventos que causam o acionamento dos triggers. Esses eventos so inseres, atualizaes e remoes. De volta s tabelas do exemplo 1, podemos imaginar uma situao em que o cliente A pede o produto B. Uma sada para registrar isso em nosso sistema executar uma stored procedure que insere o cabealho de um pedido e uma linha de pedido, e depois atualiza a quantidade estocada do produto. Outra abordagem seria que, sempre que uma linha de pedido fosse criada, a quantidade estocada correspondente ao tamanho do pedido fosse subtrada. Podemos considerar essa uma das nossas regras. Em vez de gravar a atualizao a cada vez que um pedido feito, podemos simplesmente criar um trigger que seja executado a cada vez que uma linha de pedido for inserida. Isso nos permite ter regras de negcios concretas embutidas no banco de dados.

Usando triggers

40

http://www.linuxmagazine.com.br

MySQL 5 | CAPA

O exemplo 3 mostra um trigger acionado aps cada atualizao. A palavra-chave NEW se refere aos novos valores da linha, da forma como esto aps o trmino da atualizao. A palavra-chave OLD tambm est disponvel, e contm os valores da linha da forma como estavam antes de uma atualizao ou remoo. Para o arquivamento, por exemplo, voc pode inserir os valores antigos da linha numa tabela de arquivamentos para acesso a dados de histrico. Para auditoria, voc pode inserir tanto valores antigos quanto novos numa tabela de trilhas de auditoria. Tambm possvel acionar um trigger antes de uma atualizao, insero ou remoo. Isso pode ser til quando voc quiser modicar os valores NEW da coluna, por exemplo, para validao. O exemplo 2, mostrou um atraente trecho de SQL que consultava resumos de pedidos processados. Em diversas aplicaes, isso pode ser um til conjunto de resultados para ter por perto e reutilizar em diversos pontos da aplicao. Uma view um mecanismo para armazenarmos e reutilizarmos essas consultas teis como se fossem tabelas normais. Assim, a complexidade subjacente da consulta ca escondida de ns, e podemos simplesmente selecionar as colunas dessa tabela virtual. Views no podem aceitar parmetros. Se voc precisar que sua consulta aceite parmetros, tem que criar uma stored procedure para ela. A gura 4 mostra a consulta do exemplo 3 criada como uma view. A gura 5 exibe os resultados da execuo de uma consulta usando a view. Note como ela se parece com uma consulta a qualquer tabela normal.

ral do MySQL ainda no est nalizada. As prximas verses do MySQL 5 (a 5.1 estava prxima da liberao geral quando este artigo foi escrito) e talvez o MySQL 6 devem aumentar o conjunto de recursos consideravelmente, e tambm melhorar algumas reas onde a implementao do MySQL est pior que a dos adversrios. Uma avaliao gentil da documentao [9] dos novos recursos do MySQL no site diria que ela , no mximo, adequada. Porm, diversos livros esto sendo publicados pela MySQL Press e outras editoras, mostrando mais detalhes dos novos recursos.

NOME DA SEO

O autor
Larkin Cunningham ama programas de cdigo aberto. Comeando em breve um doutorado, Larkin atualmente trabalha com Oracle PL/SQL e Java, mas encontra tempo para se aventurar em tudo relacionado a Linux. Ele pode ser contactado em larkin.cunningham@gmail.com.

Usando views

Mais Informaes
[1] MySQL 5.0 Community Edition: http://www.mysql.com/ products/database/mysql/ community_edition.html [2] Centro de tecnologia
PL/SQL da Oracle:

http://www.oracle.com/ technology/tech/pl_sql/ index.html [3] Mapeador Hibernate Objetorelacional para Java e .NET:

http://www.hibernate.org/ [4] Mapeador ActiveRecord


Objeto-relacional para Ruby:

Esse artigo apresentou alguns dos recursos das stored procedures, triggers e views do MySQL 5. Os exemplos tentam passar uma idia sobre a utilidade (ou no) desses recursos para os seus esforos de desenvolvimento de software. No se esquea que, anal de contas, as stored procedures so somente consultas SQL. Se voc escrever SQL ineciente em seu programa, provavelmente ainda ter consultas SQL inecientes em suas stored procedures. Os recursos apresentados so completamente novos no MySQL, mas quem j trabalhou com stored procedures em outros bancos de dados, como Oracle, DB2 e PostgreSQL, provavelmente se interessar mais pelas diferenas entre a implementao no MySQL e as outras. A linguagem procedu-

Prximos passos

http://rubyforge.org/ projects/activerecord/ [5] Uma publicao sobre o ANSI SQL: http://www.sigmod.org/ sigmod/record/issues/0403/ E.JimAndrew-standard.pdf [6] Navegador de consultas do MySQL: http://www.mysql.com/ products/tools/query-browser/ [7] phpMyAdmin: http://sourceforge.net/ projects/phpmyadmin [8] Extenso mysqli para PHP: http://www.php.net/mysqli [9] Documentao online escassa sobre
stored procedures do MySQL:

http://dev.mysql.com/doc/ refman/5.0/en/ stored-procedures.html

Linux Magazine #23 | Setembro de 2006

41