Você está na página 1de 13

MYSQL

STORAGE PROCEDURES

Curso Profissional Tcnico de Gesto e Programao de Sistemas Informticos Programao e Sistemas de Informao 12. Ano Turma K

MySQL Stored Procedure Temas abordados


1 - Introduo ao SQL Stored Procedures
Vais aprender o que o um stored procedure em MySQL, tambm podes compreender as vantagens e desvantagens do Stored Procedures.

2 - Getting started MySQL Stored Procedures


Neste tutorial, voc vai aprender a escrever uma stored procedure e cham-lo na linha de comando do MySQL.

3 - Variveis em Stored Procedures


Vais aprender como declarar uma varivel e usar SET e SELECT INTO para atribuir outro valor a uma varivel.

4 - Parmetros dos Stored Procedures


Neste tutorial, vais aprender a escrever Stored Procedures com parmetros. Vamos tambm analisar um par de exemplos para ajudar a entender melhor os parmetros em Stored Procedures.

5 Controle condicional
Neste tutorial, aprenders como usar o controle condicional, IF e instrues CASE em Stored Procedures.

6 - Loops em Stored Procedures


Aprenda a usar vrias instrues de loop no Stored Procedures.

Curso Profissional Tcnico de Gesto e Programao de Sistemas Informticos Programao e Sistemas de Informao 12. Ano Turma K

1 - Introduo ao SQL Stored Procedures


Um stored procedure, por definio, um segmento de cdigo SQL que armazenado na base de dados e pode ser chamado mais tarde por um programa, um trigger ou mesmo outro stored procedure. Um stored procedure, que se chama a si mesmo, recursivo. Quase todas as RDMBS suportam stored procedure recursivos, mas o MySQL no os suporta muito bem. Verifique a sua verso do MySQL antes de utilizar stored procedures recursivos. MySQL certamente o RDBMS cuja fonte mais aberta, sendo amplamente utilizado por comunidades e empresas, mas durante a primeira dcada de sua existncia, ele no suportava os stored procedure, triggers, event... Desde o MySQL verso 5.0, esses recursos foram adicionados base de dados MySQL para permitir ser mais flexvel e poderoso. Portanto, antes de iniciar este tutorial sobre o stored procedure, necessrio ter a verso 5.x do MySQL instalado no seu computador. Vantagens dos Stores Procedures Os Stored procedures aumentam o desempenho da aplicao. Uma vez criado, o Stored procedure compilado e armazenado no catlogo da base de dados. Os Stored Procedure reduz o trfego entre o servidor de aplicao e a base de dados porque em vez de enviar vrios comandos no compilados com longas instrues SQL, a aplicao s tem de enviar o nome do Stored procedure e obter os dados de volta para manipul-los ainda mais. Os Stored Procedure so reutilizveis e transparentes para qualquer aplicao que pretenda utiliz-lo. Os Stored Procedure expem a interface da base de dados para todos os aplicativos para que os programadores no tenham que programar as funes que j esto suportadas num Stored procedure. Os Stored procedure seguro. O administrador de bases de dados pode conceder o direito de acesso s aplicaes que queiram aceder aos Stored procedure armazenados no catlogo da base de dados sem conceder qualquer permisso a tabelas de dados subjacentes.

Desvantagens dos Stores Procedures Os Stored procedures fazem sobrecarga no servidor de base de dados tanto na memria como nos processadores. Os Stored procedure contm apenas SQL declarativo, por isso muito difcil escrever um procedimento com a complexidadede outras lnguas na camada de aplicao, tais como em Java, C #, C + + ...

Curso Profissional Tcnico de Gesto e Programao de Sistemas Informticos Programao e Sistemas de Informao 12. Ano Turma K
No podemos depurar um stored procedure em quase todas as RDMBSs incluindo o MySQL. Existem algumas solues sobre este problema, mas ainda no so suficientes. Escrever e manter um stored procedure geralmente exige habilidades especializadas que nem todos os programadores possuem. Isto apresenta um problema no desenvolvimento das aplicaes e na fase de manutenso. Os Stored Procedure tm as suas vantagens e desvantagens, como mencionado acima. Portanto, quando se desenvolve uma aplicao, deve haver equilbrio para escolher se deseja utilizar o Stored Procedure ou no.

2 - Getting started MySQL Stored Procedures


Neste tutorial, vamos escrever o primeiro Stored Procedure simples, e cham-lo de linha de comando do MySQL. Escrevendo o primeiro Stored Procedure O primeiro stored procedure muito simples. Ele recupera todos os produtos da tabela produtos. Primeiro vamos dar uma olhada no cdigo fonte do stored procedure abaixo:
DELIMITER // CREATE PROCEDURE GetAllProducts() BEGIN SELECT * END // DELIMITER ; FROM products;

O primeiro comando que voc v DELIMITER / /. Este comando no est relacionado com o stored procedure. DELIMITER no MySQL usado para alterar o delimitador padro (ponto e vrgula) para outro. Neste caso, o delimitador alterado de ponto e vrgula (;) para / /, assim podes ter vrias instrues SQL dentro do stored procedure, que podem ser separados por ponto e vrgula. Aps a palavra-chave END usamos delimitador / / para mostrar o fim do stored procedure. O ltimo comando muda o delimitador de volta ao padro (ponto e vrgula). A fim de criar um stored procedure usamos CREATE PROCEDURE. Aps a instruo CREATE PROCEDURE voc pode especificar o nome do stored procedure, neste caso, GetAllProducts. A parte do corpo do stored procedure comeou entre o bloco BEGIN eo bloco END. Voc pode escrever cdigo declarativo SQL aqui. Posteriormente iremos analisar isto melhor. Criamos um novo stored procedure, mas tambm precisamos saber invoc-lo no programa ou na linha de comando do MySQL.

Curso Profissional Tcnico de Gesto e Programao de Sistemas Informticos Programao e Sistemas de Informao 12. Ano Turma K
Chamar o stored procedure A fim de chamar um stored procedure, usamos o seguinte comando SQL:

Para chamar o stored procedure criado anteriormente basta escrever: CALL GetAllProducts(); Recebemos assim todos os produtos da tabela produtos.

3 - Variveis em Stored Procedures


Declarando variveis As variveis so usadas no stored procedure para armazenar o resultado imediato. Voc pode declarar uma varivel com a seguinte sintaxe:

A seguir instruo DECLARE est o nome da varivel. O nome da varivel deve obedecer a critrios de produo de nomes para variveis e no deve ter o mesmo nome da tabela ou coluna de uma base de dados. Em seguida, voc pode especificar o tipo de dados da varivel, pode ser qualquer tipo que o MySQL suporte como INT, VARCHAR, DATETIME ... juntamente com o tipo de dados definimos o tamanho da varivel. Quando voc declarar uma varivel, o seu valor inicial NULL. Voc tambm pode atribuir um valor padro para a varivel usando o comando DEFAULT. Por exemplo, podemos definir a varivel total_sale com o tipo de dados INT eo valor padro 0 como se segue: DECLARE Total_sale INT DEFAULT 0 Para declarar duas ou mais variveis com o mesmo tipo de dados podemos usar apenas um DECLARE, tais como: DECLARE x,y INT DEFAULT 0 Ns declaramos duas variveis X e Y com o mesmo tipo de dados INT e seu valor padro zero.

Curso Profissional Tcnico de Gesto e Programao de Sistemas Informticos Programao e Sistemas de Informao 12. Ano Turma K
Atribuindo variveis Uma vez que voc declarou uma varivel, voc pode comear a us-la. Para atribuir outro valor a uma varivel que voc pode usar o comando SET, por exemplo: DECLARE TOTAL_COUNT INT DEFAULT 0 SET TOTAL_COUNT = 10; O valor da varivel TOTAL_COUNT agora de dez (10). Ao lado de instruo SET, podemos usar SELECT INTO para atribuir um resultado de consulta a uma varivel. DECLARE total_products INT DEFAULT 0 SELECT COUNT(*) INTO total_products FROM products; No exemplo acima, vamos declarar a varivel total_products e iniciar seu valor em zero. Ento ns usamos instruo SELECT INTO para atribuir o total de produtos varivel total_products.

Variveis scope (locais ou globais) Uma varivel tem o seu prprio escopo. Se voc declarar uma varivel dentro de um stored procedure, ela estar fora de alcance quando chegar ao fim do stored procedure. Se voc definiu uma varivel dentro do bloco BEGIN / END num stored procedure esta estar fora de alcance quando o stored procedure atingir o END. Voc pode declarar duas ou mais variveis com o mesmo nome em escopos diferentes, a nica varivel eficaz no seu procedimento. Uma varivel com o "@" no incio varivel de sesso. Ela existe at ao final da sesso.

4 - Parmetros dos Stored Procedures


Quase todos os stored procedure a desenvolver requerem parmetros. Parmetros fazem o stored procedure mais flexvel e til. No MySQL, um parmetro adquire um dos seguintes trs modos - IN, OUT e INOUT. IN o modo padro( declarado por defeito).

Curso Profissional Tcnico de Gesto e Programao de Sistemas Informticos Programao e Sistemas de Informao 12. Ano Turma K
IN indica que um parmetro pode ser passado para um stored procedure, mas qualquer alterao dentro do stored procedure no altera o parmetro. Suponha que voc quer passar o parmetro ID, que igual a 10, para o stored procedure getAll (Id), aps executar o stored procedure o valor do Id ainda 10 mesmo que o stored procedure getAll alterar o valor do mesmo. OUT este modo indica que o stored procedure pode alterar o parmetro e devolve-lo ao programa de chamada. INOUT, obviamente, este modo a combinao do modo IN e OUT, voc pode passar parmetros para o stored procedure e recuper-los com um novo valor a partir do programa de chamada. A sintaxe da definio de um parmetro no stored procedure o seguinte: MODE param_name param_type(param_size) MODE pode ser IN, OUT ou INOUT dependendo da finalidade do parmetro especificado. param_name o nome do parmetro. O nome no deve ser o mesmo que o nome da coluna. Por fim temos o tipo de parmetro e seu tamanho. Cada parmetro separado por uma vrgula, se o stored procedure tiver mais de um parmetro. Vamos praticar com os exemplos abaixo para entender melhor. O primeiro exemplo um stored procedure para obter todos os escritrios dum dado pas. Aqui est o cdigo fonte do SQL:
DELIMITER // CREATE PROCEDURE GetOfficeByCountry(IN countryName VARCHAR(255)) BEGIN SELECT city, phone FROM offices WHERE country = countryName; END // DELIMITER ;

Como voc pode ver que ns usamos countryName como parmetro IN com seu tipo varchar e seu tamanho de 255. No corpo de stored procedure, ns mostramos todos os escritrios onde country o countryName. Suponha que queremos mostrar todos os escritrios nos EUA, basta passar o valor para os stored procedures deste modo:

Curso Profissional Tcnico de Gesto e Programao de Sistemas Informticos Programao e Sistemas de Informao 12. Ano Turma K
CALL GetOfficeByCountry('USA') Ele retorna todos os escritrios nos EUA. Para obter todos os escritrios na Frana, basta substituir a Frana pelos USA no stored procedures: CALL GetOfficeByCountry(France) Ele retorna todos os escritrios em Frana. No segundo exemplo, vamos escrever um stored procedure para contar o status de uma encomenda, esse status pode tomar valores tais como expedido, resolvido, cancelado, em espera, contestado ou em andamento. Aqui est o stored procedure:
DELIMITER $$ CREATE PROCEDURE CountOrderByStatus( IN orderStatus VARCHAR(25), OUT total INT) BEGIN SELECT count(orderNumber) INTO total FROM orders WHERE status = orderStatus; END$$ DELIMITER;

O stored procedure CountOrderByStatus tem dois parmetros: orderStatus parmetro IN; passamos o status do pedido, tal como, enviado ou em espera para obter o nmero do mesmo total o parmetro OUT que usamos para obter o total de um status especfico. Assim, para obter o nmero de pedidos enviados efectuamos a s seguintes instrues:
CALL CountOrderByStatus('enviados',@total); SELECT @total AS total_enviados;

Para obtermos o numero de encomendas em espera, efectuamos a s seguintes instrues:


CALL CountOrderByStatus('em espera ',@total); SELECT @total AS total_em_espera;

Curso Profissional Tcnico de Gesto e Programao de Sistemas Informticos Programao e Sistemas de Informao 12. Ano Turma K
No terceiro procedimento, vamos demonstrar o parmetro INOUT. O stored procedure Capitalize recebe todas as palavras em uma string e retorna-a para o programa de chamada. O cdigo-fonte do stored procedure a seguinte:
DELIMITER $$ CREATE PROCEDURE `Capitalize`(INOUT str VARCHAR(1024)) BEGIN DECLARE i INT DEFAULT 1; DECLARE myc, pc CHAR(1); DECLARE outstr VARCHAR(1000) DEFAULT str; WHILE i <= CHAR_LENGTH(str) DO SET myc = SUBSTRING(str, i, 1); SET pc = CASE WHEN i = 1 THEN ' ' ELSE SUBSTRING(str, i - 1, 1) END; IF pc IN (' ', '&', '''', '_', '?', ';', ':', '!', ',', '-', '/', '(', '.') THEN SET outstr = INSERT(outstr, i, 1, UPPER(myc)); END IF; SET i = i + 1; END WHILE; SET str = outstr; END$$ DELIMITER ;

Aqui est o uso do stored procedure Capitalize:


SET @str = 'mysql stored procedure tutorial'; CALL Capitalize(@str); SELECT @str;

E o valor de @str 'Mysql Stored Procedure Tutorial'

5 Controle condicional
O MySQL suporta duas declaraes de controle condicional, o IF e o CASE.

Curso Profissional Tcnico de Gesto e Programao de Sistemas Informticos Programao e Sistemas de Informao 12. Ano Turma K
A instruoIF
IF expression THEN commands [ELSEIF expression THEN commands] [ELSE commands] END IF;

Os comandos associados com IF ou ELSE ou ELSEIF s so executados quando a expresso avaliada como TRUE. Uma das armadilhas comuns de instruo SE o valor NULL; Quando a expresso avaliada como NULL, ela no nem verdadeira nem falsa. Aqui esto vrias combinaes IF:
IF expression THEN commands END IF;

IF expression THEN commands ELSE commands END IF;

IF expression THEN commands ELSEIF expression THEN commands ELSE commands END IF;

Voc pode ter instruo IF aninhada com outra IF. A instruo CASE
Quando vrias condies so usadas com o IF (IFs encadeados), o cdigo no fcil de ler. Neste momento, o CASE pode ser usado para tornar o cdigo mais claro. A sintaxe da instruo CASE a seguinte:

CASE WHEN expression THEN commands WHEN expression THEN commands ELSE commands END CASE;

Curso Profissional Tcnico de Gesto e Programao de Sistemas Informticos Programao e Sistemas de Informao 12. Ano Turma K

6 - Loops em Stored Procedures


O MySQL suporta loops que permitem processar os comandos de forma iterativa. Os loops padro so os seguintes: WHILE loop A sintaxe do loop WHILE a seguinte:
WHILE expression DO Statements END WHILE

Primeiro, o loop verifica a expresso, se verdade que ir executa instruo at que a expresso se tornar falsa. Porque o while loop verifica a expresso antes das instrues executadas, conhecido como pr-teste loop. Aqui est um exemplo de como usar while num stored procedure:
DELIMITER $$ DROP PROCEDURE IF EXISTS WhileLoopProc$$ CREATE PROCEDURE WhileLoopProc() BEGIN DECLARE x DECLARE str SET x = 1; SET str = WHILE x ''; <= 5 DO SET SET END WHILE; SELECT str; END$$ DELIMITER ; str = CONCAT(str,x,','); x = x + 1; INT; VARCHAR(255);

No stored procedure acima, construimos uma string repetidamente at que a varivel x seja superior a 5, depois enviamos o resultado da string para a consola usando o comando SELECT. Uma armadilha comum de quase todos os programadores encontram que a varivel x no inicializada, seu valor padro NULL e a condio de while sempre verdadeiro, o bloco de cdigo dentro do lao executado indifinidamente at que o seu servidor de base de dados tem um crash .

Curso Profissional Tcnico de Gesto e Programao de Sistemas Informticos Programao e Sistemas de Informao 12. Ano Turma K
REPEAT loop A sintaxe do repeat loop a seguinte:
REPEAT Statements; UNTIL expression END REPEAT

Primeiro as declaraes so executadas e, em seguida a expresso avaliada. Se a expresso for avaliada como verdadeira as declaraes so executadas vrias vezes at que seu valor seja falso. Because the repeat loop checks the expression after the execution of statements so it is also known as post-test loop. Porque o loop de repetio verifica a expresso aps a execuo de instrues por isso tambm conhecido como post-teste loop. We can rewrite the stored procedure above by using repeat loop as follows: Podemos reescrever o stored procedure anterior usando o REPEAT da seguinte forma:
DELIMITER $$ DROP PROCEDURE IF EXISTS RepeatLoopProc$$ CREATE PROCEDURE RepeatLoopProc() BEGIN DECLARE x DECLARE str SET x = 1; SET str = REPEAT SET SET UNTIL x > 5 END REPEAT; SELECT str; END$$ DELIMITER ; str = CONCAT(str,x,','); x = x + 1; ''; INT; VARCHAR(255);

LOOP loop, LEAVE e ITERATE

Curso Profissional Tcnico de Gesto e Programao de Sistemas Informticos Programao e Sistemas de Informao 12. Ano Turma K
A instruo LEAVE permite que voc saia do loop. um pouco como o break de outras linguagens como Java, C # ... A instruo ITERATE permite iniciar o ciclo novamente. como o continue em Java ou C #. O MySQL tambm suporta um LOOP loop que lhe permite executar comandos repetidamente e mais flexvel. Aqui est um exemplo do uso LOOP loop.
DELIMITER $$ DROP PROCEDURE IF EXISTS LOOPLoopProc$$ CREATE PROCEDURE LOOPLoopProc() BEGIN DECLARE x DECLARE str SET x = 1; SET str = ''; loop_label: LOOP IF END SET IF ELSE SET END IF; END LOOP; SELECT str; END$$ DELIMITER ; str = CONCAT(str,x,','); x > 10 THEN LEAVE IF; x = x + 1; (x mod 2) THEN ITERATE loop_label; loop_label; INT; VARCHAR(255);

O stored procedure apenas constri string com nmeros pares. Primeiro vamos definir um loop_label, se uma varivel x maior que 10, o ciclo encerrado por causa da declarao LEAVE. Caso contrrio, se a varivel x mpar, o ITERATE ignora tudo abaixo e continua, se a varivel x par, o bloco aps o ELSE constroi uma string com nmeros pares.

Você também pode gostar