diff --git a/banque.md b/banque.md index 878e693..b36a5d0 100644 --- a/banque.md +++ b/banque.md @@ -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 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** @@ -734,8 +733,6 @@ Créer une vue *account_balance_eur* pour afficher : * taux de change correspondant à la date du jour * solde converti en EUR (solde × taux) -> Supposer que *EUR* est toujours présent dans la table `currency`. - ## **7. Vue : transactions complètes** 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 : -* joindre avec une sous-requête récupérant `max(date)` pour chaque devise. - ## **14. Vue : liste des entreprises avec ancienneté** Créer une vue *company_age* indiquant : @@ -814,5 +809,3 @@ Créer une vue *bank_overview* qui croise : * leurs comptes * leurs transactions * leurs opérations - -But : proposer une vue permettant d’obtenir le *“mini bilan"* d’un titulaire. diff --git a/banque/banque.2.proc.sql b/banque/banque.2.proc.sql index d9621d8..512c4a0 100644 --- a/banque/banque.2.proc.sql +++ b/banque/banque.2.proc.sql @@ -196,7 +196,7 @@ end; $$; -create procedure transfer( +create or replace procedure transfer( p_source int, p_destination int, p_amount numeric, @@ -206,23 +206,39 @@ 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, 'CREDIT'); + 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 + p_amount + set balance = balance + round(p_amount / rate_source * rate_destination, 2) WHERE id = p_destination; end; $$;