sql >> Database >  >> RDS >> Oracle

Getalnotatie in Oracle met TO_CHAR

Zorg ervoor dat u het gegevenstype nummer gebruikt met een schaal en precisie die past bij de gegevens in plaats van NUMBER zonder schaal en precisie. Als u dollars/euro's/ponden/etc. dan het Bruto Wereldproduct was in de orde van $ 100.000.000.000.000 in 2014. Laten we aannemen dat u niet met meer dan dit te maken krijgt, dan kan uw valutakolom zijn:

NUMBER(17,2)

Als u een waarde krijgt die groter is dan dat, moet u een gezondheidscheck op uw gegevens uitvoeren en bedenken of een bedrag dat groter is dan het brutoproduct van de wereld zinvol is. Als u de waarden gaat opslaan als bijvoorbeeld yen of Zimbabwaanse dollars, pas de schaal dan op de juiste manier aan.

Je zou zelfs een subtype in een pakket kunnen definiëren als:

CREATE PACKAGE currencies_pkg IS
  SUBTYPE currency_type IS NUMBER(17,2);

  FUNCTION formatCurrency(
    amount IN CURRENCY_TYPE
  ) RETURN VARCHAR2;
END;
/

En je code om het te formatteren kan zijn:

CREATE PACKAGE BODY currencies_pkg IS
  FUNCTION formatCurrency(
    amount IN CURRENCY_TYPE
  ) RETURN VARCHAR2
  IS
  BEGIN
    RETURN TO_CHAR( currency_value, 'FM999999999999990D00' );
  END;
END;
/

Als u vervolgens naar dat subtype verwijst in uw opgeslagen procedures/pakketten, kunt u de maximale grootte van het valutagegevenstype niet overschrijden zonder dat er een uitzondering wordt gemaakt. Het formaatmodel voor het weergeven van de waarde hoeft maar op één plaats te worden gedefinieerd en aangezien de invoer beperkt is tot het valutasubtype, zal de opmaakfunctie nooit de opgelegde schaal/precisie overschrijden en kan # v.

CREATE PROCEDURE your_procedure(
  in_value1 IN ACCOUNTS_TABLE.ACCOUNT_BALANCE%TYPE,
  in_value2 IN ACCOUNTS_TABLE.ACCOUNT_BALANCE%TYPE
)
IS
  v_value CURRENCIES_PKG.CURRENCY_TYPE;
BEGIN
  -- Do something
  v_value := in_value1 + in_value2;
  -- Output formatted value
  DBMS_OUTPUT.PUT_LINE( CURRENCIES_PKG.formatCurrency( v_value ) );
END;
/


  1. SQLite invoegen

  2. PL/SQL Hoe alle attributen in ROW retourneren?

  3. Topmanieren om de database-efficiëntie te verhogen

  4. ORACLE TIMESTAMP (9) veld toewijzen aan java.util.Date