Você está na página 1de 29

Teoria de Banco de Dados

Procedimentos armazenados

Profa. Simone Carboni Garcia


Prof. Diego Machado
Procedimentos Armazenados
• Um procedimento armazenado (stored procedure) é
um conjunto de comandos SQL que executa tarefas
específicas dentro do banco de dados, ficando
armazenado no servidor como um procedimento
(função) para eventuais processamentos.

• Em um procedimento armazenado, além de


comandos SQL, também é possível utilizar estruturas
de decisão e repetição, típicas das linguagens de
programação.
Procedimentos Armazenados
• São de grande utilidade, por exemplo, para mover
parte do código de manipulação de dados para o
servidor, reduzindo assim a transferência de dados
pela rede, do servidor para o cliente.
Tipos de procedimentos
• Eles são de dois tipos:
– Procedimento (Procedure) – sem retorno.
– Função (Function) – com retorno.

• No PostgreSQL, os procedimentos e funções tem o


mesmo nome (Function), se diferenciando apenas no
retorno de variáveis.
PL/pgSQL
• A estrutura de um procedimento consiste em:

– Bloco de declaração/cabeçalho.
DECLARE
– Bloco executável.
BEGIN
– Bloco de exceções.
EXCEPTION
– Bloco de término.
END
Cabeçalho PL/pgSQL
CREATE FUNCTION nome_função(parâmetros)
RETURNS tipo_retorno
AS $$  Inicio da função.
...
$$  Final da função.
LANGUAGE 'plpgsql';
Declaração PL/pgSQL
• As variáveis que são usadas na função se situam após
o início do bloco de declaração da função.

DECLARE
V1 VARCHAR;
N1 INTEGER;

• Os tipos válidos são os mesmos da criação das


tabelas.
Execução PL/pgSQL
• O programa inicia após a declaração do bloco de
execução.

BEGIN := atribuição
IF (N1>N2) THEN = Igualdade
R:=N1;
ELSE
R:=N2;
END IF
RETURN R;
Exceções PL/pgSQL
• Caracterizado pela declaração do bloco de exceções
que pode ser oculto e o disparo da exceção.

EXCEPTION

RAISE <LEVEL> <TRATAMENTO>

NOTICE Saída de erro e grava LOG.


Ex: EXCEPTIONTudo mais abortar transações.
EXCEPTION

RAISE NOTICE 'OCORREU UMA EXCEÇÃO'


Termino PL/pgSQL
• Além de fechar a instrução com $$, nós temos a
palavra END;

..
$$
END;
LANGUAGE 'plpgsql';

• Boa parte das instruções precisa ser fechada com


(ponto-e-vírgula) para funcionarem.
Exemplo PL/pgSQL
• Primeiro vamos criar uma tabela:
create table empregados(
id numeric(10) not null,
nome varchar(100) not null,
salario numeric(10) not null,
primary key (id));

• E depois vamos inserir alguns registros:


insert into empregados values(1,'Carlos',4000);
insert into empregados values(2,'Maria',4000);
insert into empregados values(3,'Jose',4000);



Exemplo PL/pgSQL
• Vamos criar uma função chamada calculaSalario
que recebe como parâmetros o salário inicial e a
idade do empregado e retorna o salário bruto da
seguinte maneira:

1% de acréscimo por ano de vida do empregado.


Exemplo PL/pgSQL
CREATE FUNCTION calculaSalario
(salario numeric, idade numeric) returns float
as $$
DECLARE
Resultado float;
BEGIN
Resultado:=salario+(salario*idade*(0.01));

Return Resultado;

END;
$$
LANGUAGE 'plpgsql';
Aumentando a dificuldade
• O procedimento do exemplo é simples pois:
– Não possui tipos de variáveis de retorno de tuplas (registros).
– Não possui estruturas de controle.
– Não lança exceções.
– Não possui estrutura de repetição.
– Possui retorno simples (é uma função por possuir retorno).

• Um procedimento armazenado comum a um DBA:


– Possui variáveis com retorno de tuplas (registros).
– Usam intensivamente estruturas de controle.
– Lançam exceções sempre que possível.
– Uma ou várias estruturas de repetição.
– Múltiplos retornos e de tipos mais complexos.
Tipos de variáveis
• Podemos usar as seguintes variáveis:
– Scalar types (nativos do banco).
• Integer.
• Varchar.
• Numeric.
• Real.

– Composite types (customizados ou de tabelas).


• %TYPE
• %ROWTYPE
• RECORD
Comandos básicos
– Atribuição.
» a:=10;
– Igualdade.
» a=b;
– Retorno
» return a;
– Condicionais
» If,Else,Case
– Laços
» Loop,While,For
Atribuição
• Podemos atribuir valores ou expressões a uma variável.

Sintaxe:
Variável := expressão ou valor

Operador de atribuição PL/SQL.


Exemplos:
N1:= 12;
VT:='Texto e data ficam em aspas simples';
Count:=Ct+12*4;
Igualdade
• Podemos testar a igualdade de uma variável.

Sintaxe:
Variável = expressão ou valor

Exemplos: Operador de igualdade PL/SQL.


N2=10;
VT=true;
CT=N2+10;
Retorno
• Podemos ter retorno ou retorno nulo (Void).

Sintaxe:
Return Variável

Exemplos: Operador de retorno PL/SQL.


Return nota;
Return; Usado em casos especiais
Return 'Sucesso';
Condicionais
• O IF é fundamental nos procedimentos.

Sintaxe:
IF condição THEN
–código–
END IF;
Exemplos:
IF (N1>N2) THEN
MAIOR:=N1;
END IF;
Condicionais
• Claro que o ELSE não poderia ficar de fora.

Sintaxe:
IF condição THEN –código– ELSE –código–
END IF;
Exemplos:
IF (N1>N2) THEN
MAIOR:=N1;
ELSE
MAIOR:=N2;
END IF;
Condicionais
• Por último os condicionais aninhados.
Sintaxe:
IF condição THEN –código– ELSEIF condição
THEN –código– ELSE –código– END
IF;
Exemplos:
IF (N1>=6) THEN
R:='Aprovado';
ELSEIF (N1>=4) THEN
R:='EXAME';
ELSE:
R:='REPROVADO'; END IF;
Condicionais
• O Case:

Sintaxe:
CASE
WHEN condição THEN –código–
WHEN condição THEN –código–
END CASE
Exemplos:
CASE
WHEN X BETWEEN 1 AND 4 THEN Msg:=‘S’
WHEN X BETWEEN 5 AND 9 THEN Msg:=‘N’
END CASE;
Pondo em Prática
CREATE FUNCTION TesteCase (n numeric) returns text as $$
DECLARE
Msg text;

BEGIN

CASE
WHEN n BETWEEN 1 AND 4 THEN Msg:='1-4';
WHEN n BETWEEN 5 AND 9 THEN Msg:='5-9';
END CASE;

RETURN Msg;

END;
$$
LANGUAGE 'plpgsql';
Repetição
• O While garante as necessidades de repetição.
• Ele é usado em conjunto com o Loop, uma repetição
indeterminada.

Sintaxe:
While condição LOOP –código– END LOOP;
Exemplos:
While X<=100 LOOP
X:=X+1;
END LOOP;
Repetição
• O Loop é como se fosse um For infinito, ele é sempre
usado em conjunto com While, Continue e Exit
When.
Sintaxe:
LOOP –código– END LOOP;
LOOP –código– EXIT WHEN condição END LOOP;
Exemplos:
LOOP
c:=c-1;
IF c=0 THEN EXIT;
END IF;
END LOOP;
Repetição
• O FOR:

Sintaxe:
For i in [REVERSE] lmin..lmax
LOOP –código– END LOOP
Exemplos:
FOR i IN 1..100 LOOP
n:=n*a;
END LOOP;
Pondo em Prática
CREATE FUNCTION TesteFor (n numeric) returns numeric as $$
DECLARE
i numeric;

BEGIN
i:=0;

FOR i IN 1..n LOOP


n:=i*2;
END LOOP;

RETURN n;

END;
$$
LANGUAGE 'plpgsql';
Referências
• Funções SQL PostgreSQL
http://www.postgresql.org/docs/9.2/static/xfunc-sql.html

• Funções PL/pgSQL PostgreSQL


http://www.postgresql.org/docs/9.2/static/plpgsql-
overview.html

• Funções PL/pgSQL PostgreSQL

MERTINS, Luciano; Slides Banco de dados II, UCPEL, 2009.

• Estruturas de controle e repetição PL/pgSQL PostgreSQL


http://www.postgresql.org/docs/9.2/static/plpgsql-
control-structures.html