This commit is contained in:
2025-11-14 13:43:59 +01:00
parent 3b8f95e823
commit b463678176
2 changed files with 19 additions and 10 deletions

View File

@@ -716,7 +716,6 @@ Créer une vue *operation_details* affichant les opérations avec :
* le montant signé (crédit positif, débit négatif) * le montant signé (crédit positif, débit négatif)
* le solde du compte **après lopération** (bonus : fenêtre analytique) * le solde du compte **après lopération** (bonus : fenêtre analytique)
> Cet exercice introduit les **fenêtres SQL** (`sum() over (...)`).
## **5. Vue : taux de change du jour** ## **5. Vue : taux de change du jour**
@@ -734,8 +733,6 @@ Créer une vue *account_balance_eur* pour afficher :
* taux de change correspondant à la date du jour * taux de change correspondant à la date du jour
* solde converti en EUR (solde × taux) * solde converti en EUR (solde × taux)
> Supposer que *EUR* est toujours présent dans la table `currency`.
## **7. Vue : transactions complètes** ## **7. Vue : transactions complètes**
Créer une vue *transaction_summary* affichant un regroupement par transaction : Créer une vue *transaction_summary* affichant un regroupement par transaction :
@@ -795,8 +792,6 @@ Créer une seconde vue *account_credits* (montants positifs).
Créer une vue *latest_exchange_rate* qui donne, pour chaque devise, son taux de change le plus récent : Créer une vue *latest_exchange_rate* qui donne, pour chaque devise, son taux de change le plus récent :
* joindre avec une sous-requête récupérant `max(date)` pour chaque devise.
## **14. Vue : liste des entreprises avec ancienneté** ## **14. Vue : liste des entreprises avec ancienneté**
Créer une vue *company_age* indiquant : Créer une vue *company_age* indiquant :
@@ -814,5 +809,3 @@ Créer une vue *bank_overview* qui croise :
* leurs comptes * leurs comptes
* leurs transactions * leurs transactions
* leurs opérations * leurs opérations
But : proposer une vue permettant dobtenir le *“mini bilan"* dun titulaire.

View File

@@ -196,7 +196,7 @@ end;
$$; $$;
create procedure transfer( create or replace procedure transfer(
p_source int, p_source int,
p_destination int, p_destination int,
p_amount numeric, p_amount numeric,
@@ -206,23 +206,39 @@ language plpgsql
as $$ as $$
declare declare
v_transaction_id int; v_transaction_id int;
rate_source numeric;
rate_destination numeric;
begin begin
insert into transaction(amount, transaction_date) insert into transaction(amount, transaction_date)
values (p_amount, p_date) values (p_amount, p_date)
returning id into v_transaction_id; 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) insert into operation (transaction_id, account_id, amount, direction)
values (v_transaction_id, p_source, p_amount, 'DEBIT'); values (v_transaction_id, p_source, p_amount, 'DEBIT');
insert into operation (transaction_id, account_id, amount, direction) insert into operation (transaction_id, account_id, amount, direction)
values (v_transaction_id, p_destination, p_amount, 'CREDIT'); values (v_transaction_id, p_destination, p_amount / rate_source * rate_destination, 'CREDIT');
update account update account
set balance = balance - p_amount set balance = balance - p_amount
where id = p_source; where id = p_source;
update account update account
set balance = balance + p_amount set balance = balance + round(p_amount / rate_source * rate_destination, 2)
WHERE id = p_destination; WHERE id = p_destination;
end; end;
$$; $$;