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

Talformatering i Oracle ved hjælp af TO_CHAR

Sørg for, at du bruger taldatatypen med en skala og præcision, der passer til dataene i stedet for at bruge NUMBER uden skala og præcision. Hvis du skal gemme dollars/euro/pund/osv. derefter Gross World Product var af størrelsesordenen $100.000.000.000.000 i 2014. Lad os antage, at du ikke har at gøre med mere end dette, så kan din valutakolonne være:

NUMBER(17,2)

Hvis du får en værdi, der er større end det, så skal du udføre et fornuftstjek på dine data og tænke over, om et beløb større end verdens bruttoprodukt giver mening. Hvis du skal gemme værdierne som f.eks. yen eller zimbabwiske dollars, så juster skalaen passende.

Du kan endda definere en undertype i en pakke som:

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

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

Og din kode til at formatere den kan være:

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

Så hvis du refererer til den undertype i dine lagrede procedurer/pakker, vil du ikke være i stand til at overskride den maksimale størrelse af valutadatatypen uden at der er rejst en undtagelse. Formatmodellen til visning af værdien skal kun defineres et enkelt sted, og da inputtet er begrænset til valutaundertypen, vil formateringsfunktionen aldrig overskride den pålagte skala/præcision og kan ikke udsende # 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;
/


  1. MySQL - Erstat tegn i kolonner

  2. Hvad er forskellen mellem pakken com.mysql.jdbc.PreparedStatement; og java.sql.PreparedStatement?

  3. Hvordan kopierer man kun de første 4000 tegn fra Oracle NCLOB til NVARCHAR2(4000) værdi?

  4. PHP, MYSQL, HTML tabel med tabelsorter