Banco de Dados PLPGSQL Prof. Dr. Joel da Silva
- Introdução 2
- Introdução A PLPGSQL ou PL/pgSQL é uma linguagem estendida da SQL que tem por objetivo auxiliar as tarefas de programação no PostgreSQL. Ela incorpora à SQL características procedurais, como os benefícios e facilidades de controle de fluxo de programas que as melhores linguagens possuem. Por exemplo loops estruturados (for, while) e controle de decisão (if then else). PLPGSQL é uma PL/SQL significa "Procedural Language extensions to SQL", que pode ser usado em bancos de dados. O PL/SQL é a linguagem SQL com construções de programação similares a outras liguagens. Apesar do QUERY constar no nome, ela não é apenas de consulta (inclusão, alteração,...) Documentação e artigos para leitura: Versão Atual (Inglês): http://www.postgresql.org/docs/current/static/plpgsql.html Livro Practical PostgreSQL: http://www.faqs.org/docs/ppbook/book1.htm Tradução para Português (v 8.0) http://pgdocptbr.sourceforge.net/pg80/plpgsql.html WIKILIVROS PostgreSQL Prático: http://pt.wikibooks.org/wiki/postgresql_pr%c3%a1tico/fun%c3%a7%c3%b5es_definidas_pelo_usu %C3%A1rio_e_Triggers/PlpgSQL http://www.codeproject.com/articles/33734/how-to-write-pl-pgsql-functions-for-postgresql-8-3 http://postgres.cz/wiki/pl/pgsql_(en) 3
- Introdução Estrutura de uma função CREATE OR REPLACE FUNCTION OLA_MUNDO() RETURNS VOID AS $$ -- assinatura da função DECLARE -- declaração de variáveis nome varchar(50) := TSI - IFFarroupilha'; -- início de um bloco de instruções RAISE NOTICE 'OLÁ %',nome; END; --final de um bloco $$ LANGUAGE plpgsql; -- final da função Executando uma função select OLA_MUNDO() -- comando para chamar a função 4
Estrutura de uma função com parâmetros CREATE OR REPLACE FUNCTION OLA_MUNDO(nome varchar) RETURNS VOID AS $$ RAISE NOTICE 'OLÁ %',nome; END; $$ LANGUAGE plpgsql; select OLA_MUNDO( IFFarroupilha Frederico Westphalen') 5
Estrutura de uma função com parâmetros CREATE OR REPLACE FUNCTION SOMAR(n1 integer, n2 integer) RETURNS integer AS $$ RAISE NOTICE 'SOMA DOS VALORES : '; RETURN $1 + $2; END; $$ LANGUAGE plpgsql; select somar(2,4) 6
Exemplo utilizando a base dvd rental Listar todos os pagamentos realizados juntamente com a soma de total de todos os pagamentos; CREATE OR REPLACE FUNCTION PAGAMENTOS() RETURNS VOID AS $$ DECLARE pagamentos RECORD; pagamento float; total float; RAISE NOTICE '#### SELECIONANDO PAGAMENTOS ####'; total = 0; FOR pagamentos IN SELECT payment_id, payment.amount FROM payment where amount >0 LOOP pagamento = pagamentos."amount"; total = total + pagamento; RAISE NOTICE 'Valor ==> % ', pagamento; END LOOP; RAISE NOTICE 'Total ==> % ', round(total::numeric,2); RETURN;END;$$LANGUAGE plpgsql; --chamada para a função SELECT PAGAMENTOS(); 7
Exemplo utilizando a base dos correios Exemplo de Função para listar dados de uma tabela /* Função para selecionar somente as localidades do RS*/ CREATE OR REPLACE FUNCTION LOCALIDADES_RS() RETURNS VOID AS $$ DECLARE localidades RECORD; nome_localidade varchar; RAISE NOTICE '#### SELECIONANDO LOCALIDADES ####'; FOR localidades IN SELECT * FROM "LOG_LOCALIDADE" WHERE "UFE_SG" = 'RS' LOOP nome_localidade = localidades."loc_no"; RAISE NOTICE 'Nome da Localidade ==> % ', nome_localidade; END LOOP; RETURN; END; $$LANGUAGE plpgsql; --chamada para a função SELECT LOCALIDADES_RS() 8
Exemplo utilizando a base dos correios Exemplo de Função para listar dados de uma tabela /*Função para selecionar somente as localidades de um estado passado como parâmetro */ CREATE OR REPLACE FUNCTION LOCALIDADES_DO_ESTADO(estado varchar) RETURNS VOID AS $$ DECLARE localidades RECORD; nome_localidade varchar; RAISE NOTICE '#### SELECIONANDO LOCALIDADES ####'; FOR localidades IN SELECT * FROM "LOG_LOCALIDADE" WHERE "UFE_SG" = estado LOOP --FOR localidades IN SELECT * FROM "LOG_LOCALIDADE" WHERE "UFE_SG" = $1 LOOP nome_localidade = localidades."loc_no"; RAISE NOTICE 'Nome da Localidade ==> % ', nome_localidade; END LOOP; RETURN; END; $$LANGUAGE plpgsql; --chamada para a função SELECT LOCALIDADES_DO_ESTADO('SP') 9
Exemplo utilizando a base dos correios Exemplo de Função para listar dados de uma tabela /*Função para concatenar o nome da localidade com o nome do estado*/ CREATE OR REPLACE FUNCTION LOCALIDADE_ESTADO() RETURNS VOID AS $$ DECLARE localidades RECORD; nome_localidade varchar; nome_estado varchar; nome_completo varchar; RAISE NOTICE '#### CONCATENANDO NOMES DE LOCALIDADES E NOMES DE ESTADOS ####'; FOR localidades IN SELECT * FROM "LOG_LOCALIDADE" LOOP nome_localidade = localidades."loc_no"; nome_estado = localidades."ufe_sg" ; nome_completo = nome_localidade '-' nome_estado; RAISE NOTICE '% ', nome_completo; END LOOP; RETURN; END; $$LANGUAGE plpgsql; --chamada para a função SELECT LOCALIDADE_ESTADO() 10
- Exercício Crie uma função chamada ENDERECO. A função deve receber como parâmetro um CEP qualquer e retornar o nome do logradouro, a localidade, o tipo de localidade, o bairro, e o nome e sigla do estado correspondente. 11