Anda di halaman 1dari 9

Teoria de Banco de Dados

Procedimentos armazenados

Profa. Simone Carboni Garcia


Prof. Diego Machado
DML com procedimentos
• As operações DML funcionam normalmente com os
procedimentos.

• Existem as seguintes possibilidades de consultas:


– Retorno de 1 linha.
– Retorno de N linhas.

• Podemos usar variáveis nas operações DML


– INSERT/UPDATE P. passagem de variáveis para colunas.
– UPDATE/DELETE P. passagem de variáveis na seleção.
Achados e perdidos...
• Existe um operador especial que determina se um comando
DML (INSERT,UPDATE,DELETE,SELECT) atuou sobre uma linha
(executado com sucesso).

• O nome deste operador é FOUND, ele é do tipo booleano


(True / False) e pode ser usado em estruturas de condição (IF
/ ELSE).

• O FOUND age apenas no último comando DML executado,


então, em caso de múltiplos DML, outro FOUND deverá ser
lançado.
TYPE e ROWTYPE
• Estes dois tipos de atributos servem para declarar
uma variável com a estrutura de uma linha ou
coluna:

%TYPE → variável com o tipo de uma coluna.


%ROWTYPE → variável com o tipo de uma linha.

Exemplos:
Vcol PRODUTO.COD%TYPE Coluna
Vlin PRODUTO%ROWTYPE Linha (Inteira)
Pondo em Prática
CREATE FUNCTION TesteType (n numeric) returns boolean as
$$
DECLARE
ret boolean;
vcod PRODUTO.COD%TYPE;

BEGIN
ret:=false;

SELECT cod into vcod FROM PRODUTO WHERE COD=n;


IF FOUND THEN
ret:=true;
END IF;
RETURN ret;
END;
$$
LANGUAGE 'plpgsql';
Pondo em Prática
CREATE FUNCTION TesteRow (n numeric) returns boolean as $$
DECLARE
ret boolean;
vlin PRODUTO%ROWTYPE;
BEGIN
ret:=false;
SELECT * into vlin FROM PRODUTO WHERE COD=n;
IF FOUND THEN
INSERT INTO LOGPRODUTO(Id,Status) values
(vlin.cod,'Encontrado');
ret:=true;
END IF;
RETURN ret;
END;
$$
LANGUAGE 'plpgsql';
Record
• Type e RowType estão limitados a apenas uma coluna e uma
linha respectivamente.

• Mas como retornar N linhas em um registro?

• O Record é um tipo que armazena múltiplos registros


(colunas). Podemos usar o Record para outras operações DML
dentro do procedimento.

• Existem múltiplas técnicas para se varrer um Record.


Pondo em Prática
CREATE FUNCTION TesteRecord (pm numeric) returns void as $$
DECLARE

vcursor Record;

BEGIN

FOR VCURSOR IN SELECT * FROM PRODUTO WHERE PRECO>=pm


LOOP
INSERT INTO PRECOS(ID,PRECO) VALUES (VCURSOR.COD,VCURSOR.PRECO);
END LOOP;

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

Anda mungkin juga menyukai