terça-feira, 4 de novembro de 2008

STORED PROCEDURES

O conceito de STORED PROCEDURES é: " são programas armazenados no servidor, pré-compilados, chamados de forma explícita para executar alguma lógica de manipulação de dados, podendo retornar ou não algum valor".

Inicialmente é preciso saber onde ficam armazenadas as procedures no mysql. Quando tu crias uma procedure / function elas ficam armazenadas na tabela Routines. Para listar o conteudo desta tabela e admnistrar suas procedures / functions basta executar o SQL :
mysql> SELECT * FROM INFORMATTION_SCHEMA.ROUTINES;
Perceba que listamos todos os procedimentos armazenados (Stored Procedure e Functions), de todos os bancos de dados. Saliento que estamos listando somente Stored Procedure e Functions, pois, somente estas rotinas são gravadas na tabela ROUTINES do bancos de dados INFORMATION_SCHEMA. Triggers também são um tipo de procedimento armazenado, mas estão separadas em outra tabela do dicionário, chamada TRIGGERS.

mysql> SELECT * FROM INFORMATION_SCHEMA.TRIGGERS;
Sabendo disso, agora podemos explorar a sistaxe mais básica do comando:

CREATE PROCEDURE proc_name([parameters, ...])
[characteristics]
[BEGIN]
corpo_da_rotina;
[END]

Explicando:

proc_name: seu procedimento armazenado deve ter um nome, para quando for chamado, podermos então usá-lo;
tipo_param: existem 3 tipos de parâmetros em uma Stored Procedure no MySQL:
* IN => este é um parâmetro de entrada, ou seja, um parâmetro cujo seu valor será utilizado no interior do procedimento para produzir algum resultado;
* OUT => esté parâmetro retorna algo de dentro do procedimento para o lado externo, colocando os valores manipulados disponíveis na memória ou no conjunto de resultados;
* INOUT => faz os dois trabalhos ao mesmo tempo!
parameters: nessa parte do procedimento, informaremos os parâmetros da seguinte forma: [IN | OUT | INOUT] nome_parametro tipo_dado.
characteristics: as características do procedimento pode apresentar. Como não utilizaremos inicialmente tais características, vamos nos ater a sintaxe principal. Questões de segurança, se é determinística ou não, qual a linguagem que estamos utilizando e se nosso procedimento modificará dados na banco de dados, são algumas das características que poderemos definir neste item que abordaremos com mais detalhe na parte dois do artigo.
corpo_da_rotina: onde são definidos os comandos SQL que farão alguma manipulação e/ou defenderão alguma lógica, podendo retornar ou não algum resultado.

Um primeiro exemplo:

Bem basicão mesmo:
Delimiter //
Drop Procedure if exists ola //
Create Procedure ola()
Begin
Select 'Olá! Isto é uma procedure' as result;
End //
Delimiter ;
Explicando a sintaxe:

O uso do Delimiter é necessario para mudar o delimitador de comandos, que por padrão é o ";". Mudamos o DELIMITADOR para podermos usar o ";" no meio do procedimento. Caso não efetuemos essa troca, o procedimento será enviado pela metade e um erro será enviado ao terminal, por erro na sintaxe.

DELIMITADOR no MySQL, em outras situações, por padrão também é chamado de terminador. Para verificar qual é o delimitador da sessão corrente emita o comando \s, que é a forma curta do comando STATUS.

Depois eu "dropo" a procedure caso ela já exista, isso é útil pois mantém o conteudo da procedure sempre atualizado.

Crio a procedure , neste momento caso miha procedure tenha parâmentros, eu os declaro como se fosse uma função;

Declaro o "corpo" da procedure que fica entre o Begin e o End, no caso do exemplo ele emitirá a frase: 'Olá! Isto é uma procedure'.

E é isto, para usar a procedure basta rodar o comando acima e na hora em que for ultizar chamar ela assim:

call ola();

Deve aparece o resultado na tela.
Um exemplo um pouco mais complexo seria:
Delimiter $$
Drop Procedure if exists validaEdita(idconta) $$
Begin
If((Select idContaReceber From EditalItem Where idContaReceber = idConta) <> 0)Then
If ((Select pago From EditalItem Where idContaReceber = idConta) = 'S') Then
Select 'Esta Conta já está paga no Edital!' as MSG;
Else
Update EditalItem Set pago = 'S' Where idContaReceber = idConta;
Select 'Havia esta conta a receber em um edtial e seu status "pago" foi
alterado para "Sim".' as MSG;
End If;
Else
Select 'Esta conta não faz parte de nenhum edital!' as MSG;
End If;
End $$

Delimiter;
Note que nos exemplos eu usei apenas select e Update, mas poderia usar qualquer (Insert, Delete) mas o melhor é adimnistrar esse recursos através de triggers. Em breve postarei sobre Triggers

Nenhum comentário:

Postar um comentário