Você está na página 1de 3

Ol pessoal, segue o material de aplicamos em sala de aula.

Incluindo um exerccio
o qual fizemos em sala, com a resposta.
Na prxima aula vamos dar continuidade ao contedo de PLpgSQL, bem como rever as
respostas dos exerccios abaixo.

Exerccios de Funes de Escrita SQL


1) Faa uma funo fn_lista_cliente, o qual no recebe parmetros, mas retorna
os
dados de todos os clientes cadastrados, porm apenas dos clientes os quais
residem em Canoas; (use o retorno setof)

CREATE OR REPLACE FUNCTION


fn_lista_cliente() returns setof cliente AS $$
-- MOstra sempre os clientes de Canoas
select * from cliente where cidade = 'Canoas';
$$
LANGUAGE SQL;-- Funo de escrita

select * from fn_lista_cliente()

2) Faa uma funo fn_lista_cliente, o qual receba como parmetro uma cidade
e retorna os dados de todos os clientes cadastrados desta cidade (use o retorno
setof)
CREATE OR REPLACE FUNCTION
fn_lista_cliente(char(20)) returns setof cliente AS $$
-- MOstra sempre os clientes de Canoas
select * from cliente where cidade = $1;
$$
LANGUAGE SQL;-- Funo de escrita

select * from fn_lista_cliente('Canoas')


select * from fn_lista_cliente('Porto Alegre')
-- Executa a funo da 1 questo, pois esta sem parametros
select * from fn_lista_cliente()

3) Faa uma funo fn_total_pedido, o qual recebe como parmetro o nmero de um


pedido e retorna a sua quantidade total de produtos ; (dica, use na soma a funo
sum() );

CREATE OR REPLACE FUNCTION


fn_total_pedido(char(10)) returns bigint AS $$

select sum(qtde) from movimento where nro_ped = $1

$$
LANGUAGE SQL;-- Funo de escrita

--Para executar
select * from fn_total_pedido('ped1')
select * from fn_total_pedido('ped2')

4) Faa uma funo fn_altera_cliente no qual receba os parmetros necessrios


para que se possa alterar o limite e status de apenas um cliente. Esta funo
no retorna nada.
CREATE OR REPLACE FUNCTION
fn_altera_cliente(char(10), char(05), decimal(5,2)) returns setof cliente AS $$

update cliente set limite = $3, status = $2


where cod_cli = $1;

select * from cliente


where cod_cli = $1;

$$
LANGUAGE SQL;-- Funo de escrita

select * from fn_altera_cliente('c1', 'bom', 300)


select * from fn_altera_cliente('c2', 'bom', 500)

-- Aula de Funes PlpgSQL

ATENO: os e-mails devem ser enviados (respondidos) para o e-mail enviado


no caso , rafael@zaffari.com.br
No assunto, sempre adicionar : ULBRA/SJ - BD2

--Outra forma de fazer


CREATE OR REPLACE FUNCTION
fn_altera_cliente(pcod_cli char(10), pstatus char(05), plimite decimal(5,2))
returns setof cliente AS $$

update cliente set limite = plimite, status = pstatus


where cod_cli = pcod_cli;

select * from cliente


where cod_cli = pcod_cli;

$$
LANGUAGE SQL;-- Funo de escrita

CREATE or REPLACE FUNCTION fn_exemplo_a() RETURNS integer AS $$


<<bloco_externo>> --bloco nomeado
DECLARE
_qtd integer := 30;
BEGIN
RAISE NOTICE 'Quantidade aqui vale: %', _qtd; --30
_qtd := 50;
--***************
--subbloco
--***************
DECLARE
_qtd integer := 80;
BEGIN
RAISE NOTICE 'Quantidade (interno) aqui vale: %', _qtd; --80
RAISE NOTICE 'Quantidade (externo) aqui vale: %', bloco_externo._qtd; --50
END;
RAISE NOTICE 'Quantidade (externo) aqui vale: %', _qtd; --50
RETURN _qtd;
END;
$$ LANGUAGE plpgsql;

-- Executando
select * from fn_exemplo_a()
Create or Replace function fn_exemplo_parametros(in_a int, in_b int)
returns decimal(8,2)
AS $$
DECLARE
_result decimal(8,2);
BEGIN
_result := in_a / in_b;
return _result;
END;
$$ language PlpgSQL;

select * from fn_exemplo_parametros(100,3)