Files
sql/banque/banque.2.proc.bak

133 lines
2.9 KiB
Plaintext
Raw Normal View History

2025-11-16 09:34:19 +01:00
set search_path TO bank;
SHOW locale_provider;
SHOW icu_locale;
SHOW lc_collate;
SHOW lc_ctype;
create or replace procedure add_person (
p_firstname text,
p_lastname text,
p_birthdate date,
p_nb_account int
)
language plpgsql
as $$
declare
v_holder_id bigint;
begin
insert into holder(type) values ('PERSON')
returning id into v_holder_id;
insert into person(id, firstname, lastname, birthdate)
values (v_holder_id, p_firstname, p_lastname, p_birthdate);
for counter in 1..pb_nb_account loop
call add_account(v_holder_id, 'EUR');
end loop;
raise notice 'Titulaire créé : % = % %',
v_holder_id, p_firstname, p_lastname;
end;
$$;
create or replace procedure add_person (
p_firstname text,
p_lastname text,
p_birthdate date,
currencies text[]
)
language plpgsql
as $$
declare
v_holder_id bigint;
begin
insert into holder(type) values ('PERSON')
returning id into v_holder_id;
insert into person(id, firstname, lastname, birthdate)
values (v_holder_id, p_firstname, p_lastname, p_birthdate);
for counter in 1..array_length(currencies, 1) loop
call add_account(v_holder_id, currencies[counter]);
end loop;
raise notice 'Titulaire créé : % = % %',
v_holder_id, p_firstname, p_lastname;
end;
$$;
create or replace procedure add_account(
p_holder_id bigint,
p_currency text
)
language plpgsql
as $$
declare
v_account_id int;
begin
insert into account(currency_code)
values (p_currency)
returning id into v_account_id;
insert into account_holder (account_id, holder_id, share)
values (v_account_id, p_holder_id, 1);
raise notice 'Compte créé avec succès (ID=%)',
v_account_id;
end;
$$;
create or replace procedure transfer(
p_source int,
p_destination int,
p_amount numeric,
p_date date
)
language plpgsql
as $$
declare
v_transaction_id int;
rate_source numeric;
rate_destination numeric;
begin
insert into transaction(amount, transaction_date)
values (p_amount, p_date)
returning id into v_transaction_id;
select rate into rate_source
from exchange_rate er
inner join account a
on a.currency_code = er.currency_code
where id = p_source and date < p_date
order by date desc limit 1;
select rate into rate_destination
from exchange_rate er
inner join account a
on a.currency_code = er.currency_code
where id = p_destination and date < p_date
order by date desc limit 1;
insert into operation (transaction_id, account_id, amount, direction)
values (v_transaction_id, p_source, p_amount, 'DEBIT');
insert into operation (transaction_id, account_id, amount, direction)
values (v_transaction_id, p_destination, p_amount / rate_source * rate_destination, 'CREDIT');
update account
set balance = balance - p_amount
where id = p_source;
update account
set balance = balance + round(p_amount / rate_source * rate_destination, 2)
WHERE id = p_destination;
end;
$$;