Oracle BUILT-IN Function TO_NUMBER
Für einen Import aus mehreren Fremdsystemen habe ich verschiedene STRINGS erhalten, welche in Oracle in den Datentyp NUMBER umgewandelt werden müssen. Es handelte sich um Beträge mit unterschiedlicher Formatierung. Diese gilt es in den ORACLE Datentyp NUMBER zu konvertieren, ohne den Wert zu verfälschen (z.B. durch ungewollte Rundungen)
Oft habe ich komplizierte und fehleranfällige Stringoperationen im Quellcode gefunden um die übergebenen String in NUMBER Datentypen umzuwandeln.
Das muss nicht sein, da uns die Datenbank mittels der Build-In Function TO_NUMBER eine sehr mächtige Funktion zur Verfügung stellt.
Praxisbeispiel 1
Das erste System liefert numerische Werte in dem Format 999G999G999D99999, wobei die tausender Gruppen mit einem Leerzeichen gekenntzeichnet ist, z.B. -7 000,00541
Als erstes muss das Format des numerischen Wertes analysiert werden, um dann den Format- und den NLS-Parameter richtig zu bestücken.
1 2 3 4 5 6 |
SELECT to_number('-7 000,00541', '999G999G999D99999', 'NLS_NUMERIC_CHARACTERS = '', ''') v1 ,to_number('502,4', '999G999G999D99999', 'NLS_NUMERIC_CHARACTERS = '', ''') v2 ,to_number('502,4', '999G999G999D99999', 'NLS_NUMERIC_CHARACTERS = '', ''') v3 ,to_number('-121 502,4000', '999G999G999D99999', 'NLS_NUMERIC_CHARACTERS = '', ''') v4 FROM DUAL; |
Praxisbeispiel 2
Ein anderes System liefert numerische Werte in dem Format 99999999999999999999D9999999, wobei es keine tausender Gruppentrenner gibt.
1 2 3 4 5 6 |
SELECT to_number('-4545454.121211', '99999999999999999999D9999999', 'NLS_NUMERIC_CHARACTERS = ''.,''') v1 , to_number('75.0000211', '99999999999999999999D9999999', 'NLS_NUMERIC_CHARACTERS = ''.,''') v2 , to_number('-0.078029', '99999999999999999999D9999999', 'NLS_NUMERIC_CHARACTERS = ''.,''') v3 , to_number('888888994545454.1', '99999999999999999999D9999999', 'NLS_NUMERIC_CHARACTERS = ''.,''') v4 FROM DUAL; |
SCHREIBEN SIE EINEN KOMMENTAR