Procedimentos Armazenados

Fazer download em pptx, pdf ou txt
Fazer download em pptx, pdf ou txt
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

Você também pode gostar