banque
This commit is contained in:
@@ -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 l’opération** (bonus : fenêtre analytique)
|
* le solde du compte **après l’opé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 d’obtenir le *“mini bilan"* d’un titulaire.
|
|
||||||
|
|||||||
@@ -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;
|
||||||
$$;
|
$$;
|
||||||
|
|||||||
Reference in New Issue
Block a user