Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Zahlenformatierung in Oracle mit TO_CHAR

Stellen Sie sicher, dass Sie den Zahlendatentyp mit für die Daten angemessener Skalierung und Genauigkeit verwenden, anstatt NUMBER zu verwenden ohne Maßstab und Präzision. Wenn Sie Dollar/Euro/Pfund/etc. dann das Bruttoweltprodukt lag 2014 in der Größenordnung von 100.000.000.000.000 $. Nehmen wir an, dass Sie es nicht mit mehr zu tun haben, dann könnte Ihre Währungsspalte wie folgt aussehen:

NUMBER(17,2)

Wenn Sie einen Wert erhalten, der größer ist, müssen Sie Ihre Daten auf Plausibilität prüfen und überlegen, ob ein Betrag, der größer ist als das Weltbruttoprodukt, sinnvoll ist. Wenn Sie die Werte beispielsweise als Yen oder Simbabwe-Dollar speichern möchten, passen Sie die Skala entsprechend an.

Sie könnten sogar einen Untertyp in einem Paket definieren als:

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

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

Und Ihr Code zum Formatieren kann sein:

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

Wenn Sie dann in Ihren gespeicherten Prozeduren/Paketen auf diesen Untertyp verweisen, können Sie die maximale Größe des Währungsdatentyps nicht überschreiten, ohne dass eine Ausnahme ausgelöst wird. Das Formatmodell zum Anzeigen des Werts muss nur an einer einzigen Stelle definiert werden, und da die Eingabe auf den Währungsuntertyp beschränkt ist, überschreitet die Formatierungsfunktion niemals die auferlegte Skalierung/Genauigkeit und kann # s.

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;
/