Escolar Documentos
Profissional Documentos
Cultura Documentos
Tpicos
Conhecendo o PostgreSQL;
Suas principais
caractersticas;
Linguagens procedurais;
Instalao de linguagem
procedural;
Tipos de dados suportados;
Dicas para desenvolver em
PL/pgSQL;
Declaraes;
Instrues bsicas;
Estrutura de controle;
Erros e mensagens.
Objetivos
Linguagens procedurais
Estas
linguagens so chamadas
linguagens procedurais (PLs);
genericamente
de
Linguagens procedurais
PL/pgSQL
PL/Tcl
PL/Perl
PL/Python
PL/Java
A linguagem PL/pgSQL
Herdar
todos
os
tipos
de
dado,
funes
operadores
Por
fim, uma
ser declarada
como
Desenvolvimento em PL/pgSQL
complicados
pode
tornar
cdigo
difcil
de
ser
facilmente a uma
[ <<rtulo>> ]
[ DECLARE declaraes ]
BEGIN
instrues
END
ser
Comentrios em PL/pgSQL
Declaraes
Declaraes
id_usuario integer;
quantidade numeric(5);
url varchar;
minha_linha nome_da_tabela%ROWTYPE;
meu_campo nome_da_tabela.nome_da_coluna%TYPE;
uma_linha RECORD;
Declaraes
tipo
NOT
NULL
DEFAULT
:=
Declaraes
Aliases
ser
Aliases
Aliases
Cpia de tipo
varivel%TYPE
A expresso %TYPE fornece o tipo de dado da varivel ou da
coluna da tabela.
Pode ser utilizada para declarar variveis que armazenam
valores do banco de dados.
Por exemplo, supondo que exista uma coluna chamada
id_usuario na tabela usuarios, para declarar uma varivel
com o mesmo tipo de dado de usuarios.id_usuario deve ser
escrito:
id_usuario usuarios.id_usuario%TYPE;
Cpia de tipo
Tipos linha
nome nome_da_tabela%ROWTYPE;
Uma varivel de tipo composto chamada de varivel
linha (ou varivel tipo-linha).
Este tipo de varivel pode armazenar toda uma linha de
resultado de um comando SELECT ou FOR, desde que o
conjunto de colunas do comando corresponda ao tipo
declarado para a varivel.
Os campos individuais do valor linha so acessados
utilizando a notao usual de ponto como, por exemplo,
variavel_linha.campo.
Exemplo
CREATE FUNCTION get_author (integer) RETURNS text AS '
DECLARE
author_id ALIAS FOR $1;
found_author authors%ROWTYPE;
BEGIN
SELECT INTO found_author * FROM authors WHERE id =
author_id;
RETURN found_author.first_name || '' '' ||
found_author.last_name;
END;
' LANGUAGE 'plpgsql';
Tipo registro
nome RECORD;
As variveis registro so semelhantes s variveis tipo-linha,
mas no possuem uma estrutura pr-definida.
Assumem a estrutura da linha para a qual so atribudas
pelo comando SELECT ou FOR.
A subestrutura da varivel registro pode mudar toda vez
que usada em uma atribuio.
Exemplo
CREATE OR REPLACE FUNCTION getNomeEmpregado(id INTEGER)
RETURNS VARCHAR AS
$$
DECLARE
registro RECORD;
BEGIN
SELECT * INTO registro FROM empregado WHERE emp_id = id;
IF NOT FOUND THEN
RAISE EXCEPTION 'empregado % no existente', id;
END IF;
RETURN registro.emp_nome;
END;
$$
LANGUAGE plpgsql;
Atribuies
identificador := expresso;
Exemplos:
id_usuario := 20;
SELECT INTO
SELECT INTO
Exemplo
CREATE OR REPLACE FUNCTION getNomeEmpregado(id INTEGER)
RETURNS VARCHAR AS
$$
DECLARE
registro RECORD;
BEGIN
SELECT * INTO registro FROM empregado WHERE emp_id = id;
IF NOT FOUND THEN
RAISE EXCEPTION 'empregado % no existente', id;
END IF;
RETURN registro.emp_nome;
END;
$$
LANGUAGE plpgsql;
FOUND
varivel
imediatamente
especial
aps
FOUND
a
determinar se a atribuio
instruo
pode
ser
SELECT
verificada
INTO
para
FOUND
CREATE FUNCTION CONSULTAALUNO (vmatricula INT) RETURNS text
AS
$$
DECLARE
registro RECORD;
BEGIN
SELECT INTO registro * FROM ALUNO WHERE matricula =
vmatricula;
IF FOUND THEN
RAISE EXCEPTION 'no existe aluno com a matricula %',
vmatricula;
END IF;
RETURN registro.nome;
END;
$$
LANGUAGE 'PLPGSQL';
FOUND
No fazer nada
Estruturas de controle
Retorno de funo
RETURN
RETURN NEXT.
RETURN
RETURN expresso;
O comando RETURN com uma expresso termina a funo e
retorna o valor da expresso para quem chama.
Qualquer expresso pode ser utilizada para retornar um
tipo escalar. O resultado da expresso automaticamente
convertido no tipo de retorno da funo conforme descrito
nas atribuies.
Para retornar um valor composto (linha), deve ser escrita
uma varivel registro ou linha como a expresso.
RETURN
RETURN
CREATE FUNCTION soma(a INTEGER, b INTEGER) RETURNS
INTEGER AS
$$
DECLARE
res INTEGER;
BEGIN
res := a + b;
return res;
END;
$$
LANGUAGE plpgsql;
RETURN NEXT
RETURN NEXT
RETURN NEXT
CREATE OR REPLACE FUNCTION listaEmpregado() RETURNS
SETOF varchar AS
$$
DECLARE
registro RECORD;
BEGIN
FOR registro IN SELECT * FROM empregado LOOP
RETURN NEXT registro.emp_nome;
END LOOP;
RETURN;
END;
$$
LANGUAGE 'plpgsql';
Condicionais
IF-THEN
IF expresso_booleana THEN
instrues
END IF;
IF-THEN-ELSE
IF expresso_booleana THEN instrues
ELSE instrues
END IF;
IF-THEN-ELSE IF
IF-THEN-ELSIF-ELSE
IF expresso_booleana THEN
instrues
[ ELSIF expresso_booleana THEN
instrues
[ ELSIF expresso_booleana THEN
instrues
...]]
[ ELSE instrues ]
END IF;
IF-THEN-ELSIF-ELSE Exemplo
IF numero = 0 THEN
resultado := 'zero';
ELSIF numero > 0 THEN
resultado := 'positivo';
ELSIF numero < 0 THEN
resultado := 'negativo';
ELSE
resultado := 'NULL';
END IF;
Estruturas de repetio
LOOP
EXIT
WHILE
FOR
LOOP
LOOP
instrues
END LOOP;
EXIT
Exemplo 1
LOOP
-- algum processamento
IF contador > 0 THEN
EXIT; -- sair do lao
END IF;
END LOOP;
Exemplo 2
LOOP
-- algum processamento
-- mesmo resultado do exemplo anterior
EXIT WHEN contador > 0;
END LOOP;
WHILE
WHILE expresso LOOP
instrues
END LOOP;
Exemplos
WHILE quantia_devida > 0 LOOP
-- algum processamento
END LOOP;
FOR
FOR nome IN [ REVERSE ] expresso .. expresso LOOP
instrues
END LOOP;
Exemplo
FOR i IN 1..10 LOOP
-- algum processamento
RAISE NOTICE 'i %', i;
END LOOP;
Exemplo
CREATE OR REPLACE FUNCTION REVERSE ( str text ) RETURNS
text AS
$$
DECLARE
s text := ''; i int;
BEGIN
FOR i IN REVERSE length(str) .. 1 LOOP
s := s || substr(str,i,1);
END LOOP;
RETURN s;
END;
$$ LANGUAGE plpgsql;
Exemplo
CREATE OR REPLACE FUNCTION contador_cli () RETURNS
INTEGER AS
$$
DECLARE
registro RECORD; qtde INTEGER;
BEGIN
qtde := 0;
FOR registro IN SELECT * FROM Cliente LOOP
qtde := qtde + 1;
RAISE NOTICE ' nome: %, cidade: %' , registro.nome_cli,
registro.cidade;
END LOOP;
RETURN qtde;
END;
$$ LANGUAGE 'plpgsql';
Captura de erros
Captura de erros