Você está na página 1de 6

Avaliação sobre Funções - Banco de Dados II

Luiz Ricardo Brumati De Lima - a2155184

I. INTRODUÇÃO

Código para criação das tabelas:

create table Cliente (


id_cli integer generated always as identity primary key,
CPF varchar (14) unique,
Nome varchar (50) not null,
data_reg date,
valor_max_liberado numeric (10,2)
);

create table Emprestimo (


id_empr integer generated always as identity primary key,
data_empr date,
valor_total numeric (10,2) not null,
nro_parcelas decimal (4) not null,
quitado boolean default false,
id_cli integer,
constraint fk_id_cli foreign key (id_cli) references cliente (id_cli) on delete
cascade on update cascade
);

Funções utilitárias:

create or replace function randomNumberBetween(min_value integer, max_value integer)


returns integer as
$$
begin
return floor(random()* (max_value - min_value + 1) + min_value);
end;
$$language plpgsql;

Além disso, também foram utilizadas as funções randomNumber () , randomText() e randomDate() ,


disponibilizadas no moodle da disciplina.
Para popular a tabela de clientes com valores randômicos:

do $$
declare
j numeric;
randomCPF varchar;
nomesArray varchar[] = '{"Luiz","Maria","João","Roberto", "Carlos",
"Kamila","Eduarda","Ana", "Rafael", "Henrique", "Laura",
"Flavia","Diego","Gustavo", "Miguel", "Alice", "Helena",
"Pedro", "Paula", "Gabriela", "Bernardo"}';
begin
for i IN 10..500
loop
j = round(random() * 20)+1;
randomCPF = concat(randomNumberBetween (100,999),'.',randomNumberBetween
(100,999), '.', randomNumberBetween (100,999),'-',randomNumberBetween (10,99));

insert into cliente (CPF, Nome, data_reg, valor_max_liberado)


values (randomCPF, nomesArray[j], randomData(), randomNumber(4));
end loop;
end $$;

Para popular a tabela de empréstimos:

do $$
declare
client_id integer := 0;
begin
for j IN 10..500
loop

client_id = client_id + 1;
insert into emprestimo (data_empr, valor_total, nro_parcelas, quitado, id_cli)
values (randomData(),randomNumber(4),randomNumberBetween (10,50), false,
client_id);

insert into emprestimo (data_empr, valor_total, nro_parcelas, quitado, id_cli)


values (randomData(),randomNumber(4),randomNumberBetween (10,50), false,
client_id);
end loop;
end $$;
A visualização de alguns dos dados inseridos nas tabelas é exibida a seguir:

Figura 1 - Dados inseridos na tabela de clientes

Figura 2 - Dados inseridos na tabela de empréstimos

II. EXERCÍCIO 1

Definição da função:

create or replace function getClientIDByName (nomeCliente Cliente.nome%type)


returns table (c_id Cliente.id_cli%type, c_nome Cliente.nome%type)
as $$
declare
id_cliente Cliente.id_cli%type;
begin
return query (select cliente.id_cli, cliente.nome from cliente
where upper (cliente.nome) like '%' || upper (nomeCliente) || '%');
end;
$$ language plpgsql;
Ao executar o comando select * from getClientIDByName('pedro') , o seguinte resultado é
obtido:

Figura 3 - Resultado da busca realizada por meio da função getClientIDByName.

III. EXERCÍCIO 2
Definição da função:

create or replace function getClientDebt (idCliente Cliente.id_cli%type)


returns Emprestimo.valor_total%type as $$
begin
return (select sum (valor_total) from Emprestimo where Emprestimo.id_cli =
idCliente);
end;
$$ language plpgsql;

Ao executar select * from emprestimo where id_cli = 10 , é possível notar que o cliente cujo
id é igual a 10 possui 2 empréstimos registrados:

Figura 4 - Resultado da busca por emprestimos do cliente com ID igual a 10.

Em seguida, ao utilizar o comando select * from getClientDebt(10) para chamar a função


criada, obtém-se como resposta a soma total de todas as dívidas do cliente:

Figura 5 - Resultado da função getClientDebt para o cliente com id=10.


IV. EXERCÍCIO 3
Definição da função:

create or replace function getClientRegDate (idCliente Cliente.id_cli%type)


returns Cliente.data_reg%type as $$
begin
return (select (cliente.data_reg) from cliente where cliente.id_cli = idCliente);
end;
$$ language plpgsql;

Ao executar o comando select * from getClientRegDate(10) obtém-se como retorno o resultado


equivalente a data de sua data de registro:

Figura 6 - Resultado da busca pela data de registro do cliente com id 10.

V. EXERCÍCIO 4
Definição da função:

create or replace function setValorCliente (cpfCliente Cliente.cpf%type, novoValor


Cliente.valor_max_liberado%type)
returns table (c_cpf Cliente.cpf%type, c_valor_liberado
Cliente.valor_max_liberado%type)
as $$
begin
update Cliente set valor_max_liberado = novoValor where Cliente.cpf = cpfCliente;
return query select cpf, valor_max_liberado from cliente where Cliente.cpf =
cpfCliente;
end;
$$ language plpgsql;

Em seguida, ao executar os comando select * from setValorCliente('105.591.688-54', 700)


os valores são atualizados na tabela e podem ser vistos ao utilizar select * from cliente where
cpf = '105.591.688-54':

Figura 7 - Resultado da busca ordenada pelos clientes, em que a alteração pode ser visualizada na coluna
valor_max_liberado.
VI. EXERCÍCIO 5

Definição da função:

create or replace function endDebt (idEmprestimo Emprestimo.id_empr%type)


returns table (e_id Emprestimo.id_empr%type, e_quitado Emprestimo.quitado%type)
as $$
begin
update Emprestimo set quitado = true where Emprestimo.id_empr = idEmprestimo;
return query select id_empr, quitado from Emprestimo where Emprestimo.id_empr =
idEmprestimo;
end;
$$ language plpgsql;

Ao chamar a função por meio do comando select * from endDebt(10), o débito do cliente é
quitado. É possível visualizar a alteração realizada efetivamente com select * from emprestimo
where id_empr = 10 :

Figura 8 - Resultado da busca, em que o resultado da coluna ‘quitado’ foi devidamente alterado.

VII. EXERCÍCIO 6

Definição da função:

create or replace function getOldestDebt (idCliente Cliente.id_cli%type)


returns table (e_data Emprestimo.data_empr%type, valor Emprestimo.valor_total%type)
as $$
begin
return query (select data_empr, valor_total from Emprestimo
where Emprestimo.quitado = false
and Emprestimo.data_empr = (select min (data_empr) from Emprestimo
where Emprestimo.id_cli = idCliente));
end;
$$ language plpgsql;

Ao chamar a função por com select * from getOldestDebt(10) , o resultado a seguir é obtido, ao
exibir a data e o valor do débito pendente mais antigo do cliente:

Figura 9 - Resultado da busca com a função getOldestDebt, que retorna o débito mais antigo do cliente informado.

Você também pode gostar