2013-08-20 21 views
6

ho eseguito in un limite peculiare Xnumber format element usato in to_number e to_char quando ero converting hexadecimal numbers to decimal numbers.Oracle numero formato modello lunghezza massima

Sembra che il modello in formato numerico abbia una lunghezza massima di 63 caratteri, ma non riesco a trovare il limite indicato in the docs. Per esempio. viene indicata la lunghezza massima del modello di formato datetime:

La lunghezza totale di un modello di formato datetime non può superare i 22 caratteri.

Con 63 X es:

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

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

Con 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 

ho provato solo X elemento formato è rilevante per la mia attività corrente.

Le domande:

  1. Si tratta di un noto limite modello di formato numerico che è appena manca dalla documentazione?
  2. Come si converte un numero esadecimale di 64 (e più lungo) numero di cifre in un numero decimale?
+0

Qual è lo scopo di tale conversione? Fai qualche calcolo aritmetico con valori numerici o semplicemente memorizza e mostra? – ThinkJet

+0

@ThinkJet Si tratta di un caricamento di dati da un dispositivo hardware legacy di terze parti in esecuzione dalla metà degli anni '90. Una nuova versione ha introdotto questi campi esadecimali più grandi. La conversione è stata fatta perché è sempre stata fatta - nessuno qui sa perché. Dopo aver pulito alcuni angoli polverosi ci siamo resi conto che il sistema finale non utilizza più questo indicatore di prestazioni specifico, quindi potremmo semplicemente lasciarlo cadere (che sollievo). Sembra anche che lo scopo dell'indicatore sia cambiato a un certo punto e contiene diversi segmenti che devono essere decodificati separatamente ma nessuno ci ha detto. Oh, le gioie di un programmatore di manutenzione! – user272735

+1

Ok. Sono solidale con te per i problemi di manutenzione. Se qualche volta dopo incontri nuovamente questo indicatore, dai un'occhiata a ['rawtohex'] (http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions131.htm) e [' hextoraw'] (http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions131.htm) funzioni per effettuare la conversione e ['UTL_RAW'] (http://docs.oracle.com/cd/B28359_01/appdev .111/b28419/u_raw.htm) pacchetto per estrarre letture specifiche ed eseguire operazioni a livello di bit. – ThinkJet

risposta

2

È oltre precisione NUMBER può andare. Maggiori informazioni nella documentazione ufficiale: http://docs.oracle.com/cd/E16655_01/server.121/e17209/sql_elements001.htm#SQLRF00222

+0

Io non la penso così. Secondo 'bc' il numero esadecimale a 64 cifre più grande in decimale è di ca. '1.2 x 10^77' che dovrebbe adattarsi molto bene all'intervallo del' numero' di Oracle (valore massimo: '1.0 x 10^126 - 1'). – user272735

+2

@ user272735 Il valore assoluto è una cosa diversa. Il numero massimo di cifre significative è 'precisione' e [limitato a 39 o 40 cifre decimali] (http://docs.oracle.com/cd/E16655_01/server.121/e17209/sql_elements001.htm#SQLRF00222) per' numero' tipo di dati. – ThinkJet

+0

@ThinkJet Ah, ma ovviamente! Solo dopo il tuo commento mi sono reso conto di ciò che mi mancava quando leggevo la documentazione. ti preghiamo di modificare il tuo post in modo da poter invogliare. – user272735