2013-08-20 11 views
6

I laufen in einer eigentümlichen Grenze in Xnumber format element verwendet in to_number und in to_char wenn I converting hexadecimal numbers to decimal numbers war.Oracle Zahlenformat Modell maximale Länge

Es sieht so aus, als hätte das Zahlenformatmodell eine maximale Länge von 63 Zeichen, aber ich kann das Limit, das in the docs erwähnt wird, nicht finden. Z.B. Die maximale Länge des Datetime-Formatmodells wird angegeben:

Die Gesamtlänge eines Datetime-Formatmodells darf 22 Zeichen nicht überschreiten.

Mit 63 X es:

SQL> select to_number('A', rpad('X', 63, 'X')) from dual; 

TO_NUMBER('A',RPAD('X',63,'X')) 
------------------------------- 
          10 

Mit 64 X es:

SQL> select to_number('A', rpad('X', 64, 'X')) from dual; 
select to_number('A', rpad('X', 64, 'X')) from dual 
         * 
ERROR at line 1: 
ORA-01481: invalid number format model 

Ich habe nur X Format Element versucht, wie es für meine aktuelle Aufgabe relevant ist.

Die Fragen:

  1. Ist das ein bekanntes Zahlenformat Modell Einschränkung, die nur von der Dokumentation fehlt?
  2. Wie wandle ich eine Hexadezimalzahl mit 64 (und längerer) Ziffernlänge in eine Dezimalzahl um?
+0

Was ist der Zweck einer solchen Umwandlung? Rechnen Sie mit Zahlenwerten oder speichern und anzeigen? – ThinkJet

+0

@ThinkJet Dies ist eine Datenlast von einem Legacy-Hardwaregerät eines Drittanbieters, das seit Mitte der 90er Jahre läuft. Eine neue Version führte diese größeren hexadezimalen Felder ein. Die Umstellung wurde gemacht, weil es immer gemacht wurde - niemand weiß warum. Nachdem wir einige staubige Ecken gereinigt hatten, stellten wir fest, dass das Endsystem diesen spezifischen Leistungsindikator nicht mehr verwendet, so dass wir es einfach fallen lassen konnten (was für eine Erleichterung). Es sieht auch so aus, als hätte sich der Zweck des Indikators irgendwann geändert und er enthält mehrere Segmente, die separat dekodiert werden müssen, aber niemand hat es uns gesagt. Oh, die Freuden eines Wartungsprogrammierers! – user272735

+1

Ok. Ich habe Verständnis für Wartungsprobleme. Wenn Sie diesen Indikator irgendwann später wiedertreffen, sehen Sie sich ['rawtohex '] (http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions131.htm) und [' hextoraw'] (http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions131.htm) Funktionen zur Konvertierung und ['UTL_RAW'] (http://docs.oracle.com/cd/B28359_01/appdev .111/b28419/u_raw.htm) Paket, um bestimmte Messwerte zu extrahieren und Operationen auf Bit-Ebene durchzuführen. – ThinkJet

Antwort

2

Es ist jenseits präzision NUMMER kann gehen. Weitere Informationen in der offiziellen Dokumentation: http://docs.oracle.com/cd/E16655_01/server.121/e17209/sql_elements001.htm#SQLRF00222

+0

Ich glaube nicht. Laut 'bc' ist die größte 64-stellige hexadezimale Zahl in Dezimal. '1,2 x 10^77', die sehr gut zum Bereich von Oracle 'number passen sollte (maximaler Wert:' 1.0 x 10^126 - 1'). – user272735

+2

@ user272735 Der absolute Wert ist eine andere Sache. Die maximale Anzahl der signifikanten Ziffern ist 'precision' und [auf 39 oder 40 Dezimalstellen begrenzt] (http://docs.oracle.com/cd/E16655_01/server.121/e17209/sql_elements001.htm#SQLRF00222) für' number' Datentyp. – ThinkJet

+0

@ThinkJet Ah, aber natürlich! Erst nach deinem Kommentar wurde mir klar, was ich verpasst habe, als ich die Dokumentation gelesen habe. igr bearbeite bitte deinen Beitrag, damit ich upvoten kann. – user272735