Oracle
 sql >> Database >  >> RDS >> Oracle

Formattazione dei numeri in Oracle utilizzando TO_CHAR

Assicurati di utilizzare il tipo di dati numerico con la scala e la precisione appropriate ai dati anziché utilizzare NUMBER senza scala e precisione. Se intendi archiviare dollari/euro/sterline/ecc. quindi il Prodotto mondiale era dell'ordine di $ 100.000.000.000.000 nel 2014. Supponiamo che non avrai a che fare con più di questo, quindi la tua colonna valuta può essere:

NUMBER(17,2)

Se ottieni un valore maggiore di quello, devi eseguire un controllo di integrità dei tuoi dati e pensare se ha senso un importo maggiore del prodotto lordo mondiale. Se intendi memorizzare i valori come, ad esempio, Yen o dollari dello Zimbabwe, regola la scala in modo appropriato.

Puoi anche definire un sottotipo in un pacchetto come:

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

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

E il tuo codice per formattarlo può essere:

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

Quindi, se fai riferimento a quel sottotipo nelle tue procedure/pacchetti archiviati, non sarai in grado di superare la dimensione massima del tipo di dati di valuta senza che venga sollevata un'eccezione. Il modello di formato per visualizzare il valore deve solo essere definito in un unico luogo e poiché l'input è limitato al sottotipo di valuta, la funzione di formattazione non supererà mai la scala/precisione imposta e non potrà produrre # 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;
/