2017-02-27 1 views
0

J'ai une exigence pour convertir le très long montant à un comma separated value in oracle. Je cherchais dans google. mais j'ai des solutions qui ne fonctionnent que pour les petits nombres. Mais pas pour un nombre important. Voici la solution que j'ai. Mais ne fonctionne pas correctement. Je recevais ############ ... si je cours le ci-dessous.format un nombre long avec des virgules dans Oracle

SELECT TO_CHAR(6965854565787645667634565432234565432345643265432345643242087, 
'99G999G999G9999', 'NLS_NUMERIC_CHARACTERS=",."') as test 
FROM dual; 

sortie souhaitée:

6,965,854,565,787,645,667,634,565,432,234,565,432,345,643,265,432,345,643,242,087

S'il vous plaît aidez-moi. Merci d'avance.

+1

D'où vient ce nombre et en quel type de données? Vous pouvez le faire si c'est déjà une chaîne, mais comme mathguy le dit en nombre, c'est au-delà de la précision autorisée d'Oracle. –

Répondre

1

Les nombres dans Oracle ne peuvent pas avoir plus de 38 chiffres significatifs. Vous avez beaucoup plus que cela.

Si je peux, quel genre de «montant» est-ce? Ma compréhension est que Oracle a été conçu pour gérer les valeurs de la vie réelle. Quelle est la signification possible du numéro d'échantillon que vous avez affiché?

Ajouté: L'original dans un commentaire (ci-dessous) a indiqué qu'il obtient la même erreur avec un nombre plus court, seulement 34 chiffres.

Deux numéros. Premièrement, le modèle de format doit avoir au moins le nombre de chiffres requis (de 9). to_char(100000, '9G999') produira la sortie #### parce que le modèle de format ne permet que 4 chiffres, mais l'entrée est de 6 chiffres.

Ensuite, après cela est corrigé, la sortie peut toujours sembler incorrecte dans l'application frontale, comme SQL * Plus. En SQL * Plus, la largeur par défaut d'une colonne numérique est 10 (je crois). Cela peut être changé en 38, par exemple avec la commande set numwidth 38. Dans d'autres interfaces, comme Toad et SQL Developer, la largeur numérique par défaut est un paramètre qui peut être modifié via l'interface utilisateur graphique.

Plus ajouté - en fait le résultat de to_char est une chaîne, et par des chaînes par défaut de toute longueur doit être affiché sur OK dans une frontal, de sorte que la largeur numérique est probablement hors de propos. (Et, en tout cas, il ne modifie pas l'affichage des chaînes, y compris le résultat de to_char().)

+1

Ce nombre est plus que le nombre d'atomes dans l'univers ...;) – BobC

+0

J'ai essayé avec ce nombre qui est inférieur à 38 chiffres. 6965854565787645667634565432234565 Il montre toujours le même ##### ... –

+0

@SreeBhanu - OK, j'ai ajouté à ma réponse initiale. – mathguy

1
SELECT TO_CHAR(
    6676345654322345654323456432654323456, 
    '999G999G999G999G999G999G999G999G999G999G999G999G999', 
'NLS_NUMERIC_CHARACTERS=",."') as test FROM dual 

    TEST 
    ------------------------------------------------------------ 
     6,676,345,654,322,345,654,323,456,432,654,323,456 
+0

Je ne suis pas sûr que cela fonctionne.Si vous avez réellement essayé d'utiliser le numéro que le PO nous a donné, vous obtiendrez un ORA-01481 (modèle de format numérique invalide). –

+0

Cela utilise un nombre de 38 chiffres, selon sa mise à jour. – BobC

+0

La commande 'column' n'est pas nécessaire; Par défaut, SQL \ * Plus va se développer pour s'adapter à la chaîne la plus longue d'une colonne de chaîne. – mathguy

2

S'il vous plaît vérifier si la requête ci-dessous peut vous aider.

SELECT ltrim(regexp_replace('00' 
    || '6965854565787645667634565432234565432345643265432345643242087', '(...)', ',\1'),',|0') AS t 
FROM dual; 
+0

Merci Tajinder .. Cela fonctionne .. –

1

@AlexPoole a souligné que peut-être votre entrée est une chaîne.

Je n'ai pas eu cette ambiance; mais si en fait votre entrée est une chaîne, et si vous savez que la longueur ne dépasse pas 99 chiffres, vous pouvez faire quelque chose comme ci-dessous. Si vos chaînes peuvent être plus longues que 99, remplacez 99 ci-dessous par un multiple suffisamment grand de 3. (Ou, vous pouvez le remplacer par une valeur calculée, 3 * ceil(length(str)/3)).

with 
    inputs (str) as (
     select '12345678912345' from dual 
    ) 
-- WITH clause is only for testing/illustration, not part of the solution 
select ltrim(regexp_replace(lpad(str, 99, ','), '(.{3})', ',\1'), ',') as test 
from inputs; 

TEST 
------------------ 
12,345,678,912,345