2009-08-31 7 views
0

J'ai un morceau de ma requête dans Oracle qui génère percentile discret:Poignée différence de précision dans Oracle

... 
PERCENTILE_DISC(0.9999) WITHIN GROUP(ORDER BY DURATION_COUNT) as PERCENTILE_9999_QTY, 
... 

Le type de données de PERCENTILE_9999_QTY est Number(8).

Il fonctionne très bien, sauf dans certains cas, je reçois cette erreur:

ORA-01438: value larger than specified precision allowed for this column

Je préfère ne pas changer le type de données Number(8). Y at-il un moyen de s'assurer que la valeur correspond à la précision Number(8)?

Répondre

2

Si le résultat ne peut pas tenir dans votre N (8) colonne alors il n'y a pas grand-chose que vous pouvez faire, sauf (a) soulever une exception, ou (b) mettre quelque chose d'autre à la place:

SELECT ... 
    CASE 
     WHEN PERCENTILE_DISC(0.9999) 
      WITHIN GROUP(ORDER BY DURATION_COUNT) 
      < 100000000 
     THEN PERCENTILE_DISC(0.9999) 
      WITHIN GROUP(ORDER BY DURATION_COUNT) 
     ELSE NULL 
    END as PERCENTILE_9999_QTY, 
... 
1

De l'documentation :

This function takes as an argument any numeric datatype or any nonnumeric datatype that can be implicitly converted to a numeric datatype. The function returns the same datatype as the numeric datatype of the argument.

Si vous voulez Numéro (8) comme sortie, vous devez exécuter cette fonction sur un ensemble de données qui correspond en nombre (8).

Questions connexes