Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Administration
Administration Forum d'entraide sur l'administration du serveur Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/04/2011, 10h19   #1
Invité régulier
 
Inscription : février 2011
Messages : 41
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 41
Points : 8
Points : 8
Par défaut Forcer la décimale

Bonjour à tous,

Je souhaitais savoir comment on pouvait forcer la décimale sous Oracle.
J'ai des valeurs rentrées dans un fichier plat (ex:55.00) et oracle m'insère 55 dans mes tables.

J'utilise la fonction to_number() mais je ne sais pas comment préciser le "forcage" des chiffres décimaux.

Merci,
NarbO
NarbOni est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 10h25   #2
Membre chevronné
 
Homme O. Joly
Support
Inscription : décembre 2010
Messages : 287
Détails du profil
Informations personnelles :
Nom : Homme O. Joly
Âge : 38
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Support
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2010
Messages : 287
Points : 617
Points : 617
C'est une question d'affichage pas de stockage de données.

Si dans votre select vous utilisez to_char(col,'9999999D99') et non to_number, deux décimales vont s'afficher.

http://download.oracle.com/docs/cd/B...nctions181.htm
ojo77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 12h01   #3
Invité régulier
 
Inscription : février 2011
Messages : 41
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 41
Points : 8
Points : 8
Oui je suis bien d'accord concernant l'affichage.
Par contre, que ce soit char ou number rien ne change, et j'ai essayé bcp de fmt différent (9999999.99 // 9999999.009 // FM9999999.99 // FM99999999.009...)

D'ailleurs même quand j'ai un chiffre composé de la sorte 55.50 dans mon fichier plat à l'affichage il va ressembler à ça 55.5

En gros, il écourte au maximum les décimales..

J'ai aussi essayé de modifier les NLS_TERRITORY et LANGUAGE à France et French mais ça ne change rien quant à l'affichage.
NarbOni est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 13h27   #4
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 442
Points : 10 442
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Avec la fonction "réciproque" de to_number : to_char.
Code :
1
2
3
4
5
6
SELECT to_char(55.00, '99D00', 'nls_numeric_characters=''.,''') AS affichage
  FROM dual;
 
AFFICHAGE  
---------
    55.00
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 13h38   #5
Invité régulier
 
Inscription : février 2011
Messages : 41
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 41
Points : 8
Points : 8
Oui ça marche avec un select classique, mais je m'en sers dans mon ctl de cette fonction, et derrière à l'affichage si je fais un select * from matable je ne vois pas les décimales.
NarbOni est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 13h50   #6
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 442
Points : 10 442
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Vous n'avez pas compris le principe.

Vous recevez un fichier texte qui ne contient que des char.
Quand vous insérez vos données dans votre table, il faut convertir les chaînes qui vous intéressent en nombre.
Donc dans votre fichier CTL, c'est bien la fonction to_number que vous devez utiliser.

Une fois que votre donnée est dans votre table, elle est stockée dans un format numérique.
Lorsque vous faites de l'affichage, ce nombre est converti en chaîne de caractères.
Vous pouvez alors forcer un affichage particulier à partir de votre nombre --> fonction to_char.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/04/2011, 14h21   #7
Invité régulier
 
Inscription : février 2011
Messages : 41
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 41
Points : 8
Points : 8
Donc, comment gérer l'insertion de données de type date si elles ne sont pas tout le temps renseignées ?

exemple :

Code csv :
1
2
3
4
5
6
010130;MIRIBEL LES ECHETS AM;Dec 31 2004 12:00AM;;342010;037;0
010150;BOURG EN BRESSE ATM;;752800;540750;039;0
010230;CHATILLON BELLEGARDE PPDC;;011790;381830;034;0
010250;BELLEY PPDC;;011790;381830;034;0
010265;BAGE LE CHATEL EAR GP;;731770;693910;038;0
010270;CEYZERIAT CC-T1;Feb 16 2009 12:00AM;011790;381830;034;0
NarbOni est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 14h27   #8
Membre chevronné
 
Homme O. Joly
Support
Inscription : décembre 2010
Messages : 287
Détails du profil
Informations personnelles :
Nom : Homme O. Joly
Âge : 38
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Support
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2010
Messages : 287
Points : 617
Points : 617
1°) Créer une table externe qui pointe sur votre fichier CSV ( http://www.orafaq.com/node/848 )
2°) Insérer les données à partir de cette table

=> aucune conversion, les nulls sont gérés

Exemple :

1°) donner les droits qui vont bien à l'utilisateur qui doit utiliser la table externe (dans notre cas : toto)

Code :
1
2
3
4
5
6
7
8
9
10
connect / AS sysdba
 
CREATE OR REPLACE directory xtern_data_dir
AS '/home/oracle/load'
/
 
GRANT READ,WRITE ON directory xtern_data_dir TO toto
/
 
connect toto/toto
On crée le fichier fic.csv

Code :
1
2
3
4
5
6
010130;MIRIBEL LES ECHETS AM;Dec 31 2004 12:00AM;;342010;037;0
010150;BOURG EN BRESSE ATM;;752800;540750;039;0
010230;CHATILLON BELLEGARDE PPDC;;011790;381830;034;0
010250;BELLEY PPDC;;011790;381830;034;0
010265;BAGE LE CHATEL EAR GP;;731770;693910;038;0
010270;CEYZERIAT CC-T1;Feb 16 2009 12:00AM;011790;381830;034;0
Définition de la table externe

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
CREATE TABLE xtern_table
     ( ID_VILLE varchar2(6),
       VILLE    varchar2(50),
       DATE_QVB date,
       CODE1 number(8,2),
       CODE2 number(8,2),
       CODE3 number(5),
       CODE4 number(2,1)	   
     )
     organization external
     ( DEFAULT directory xtern_data_dir
       access parameters
       ( records delimited BY newline
         FIELDS terminated BY ';' 
		        ( ID_VILLE char(6),
                  VILLE    char(50),
                  DATE_QVB char(19) date_format DATE mask "Mon DD YYYY HH:MIAM",
                  CODE1 char(8),
                  CODE2 char(8),
                  CODE3 char(4),
                  CODE4 char(1)
                ) 
       )
       location ('fic.csv')  
   )
 /
Interrrogation de cette table externe

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
SET LINES 155
SELECT * FROM xtern_table
/
 
 
ID_VIL VILLE                                              DATE_QVB       CODE1      CODE2      CODE3      CODE4
------ -------------------------------------------------- --------- ---------- ---------- ---------- ----------
010130 MIRIBEL LES ECHETS AM                              31-DEC-04                342010         37          0
010150 BOURG EN BRESSE ATM                                              752800     540750         39          0
010230 CHATILLON BELLEGARDE PPDC                                         11790     381830         34          0
010250 BELLEY PPDC                                                       11790     381830         34          0
010265 BAGE LE CHATEL EAR GP                                            731770     693910         38          0
010270 CEYZERIAT CC-T1                                    16-FEB-09      11790     381830         34          0
 
6 rows selected.
 
DESC xtern_table
 Name                                                                                   NULL?    Type
 -------------------------------------------------------------------------------------- -------- ----------------------------------------------------------
 ID_VILLE                                                                                        VARCHAR2(6)
 VILLE                                                                                           VARCHAR2(50)
 DATE_QVB                                                                                        DATE
 CODE1                                                                                           NUMBER(8,2)
 CODE2                                                                                           NUMBER(8,2)
 CODE3                                                                                           NUMBER(5)
 CODE4                                                                                           NUMBER(2,1)
 
SELECT ID_VILLE, VILLE, to_char(DATE_QVB,'DD/MM/YYYY HH24:MI') dte, code1, code2, to_char(code3,'099D00') code3, code4
FROM xtern_table
/
 
ID_VIL VILLE                                              DTE                   CODE1      CODE2 CODE3        CODE4
------ -------------------------------------------------- ---------------- ---------- ---------- ------- ----------
010130 MIRIBEL LES ECHETS AM                              31/12/2004 00:00                342010  037.00          0
010150 BOURG EN BRESSE ATM                                                     752800     540750  039.00          0
010230 CHATILLON BELLEGARDE PPDC                                                11790     381830  034.00          0
010250 BELLEY PPDC                                                              11790     381830  034.00          0
010265 BAGE LE CHATEL EAR GP                                                   731770     693910  038.00          0
010270 CEYZERIAT CC-T1                                    16/02/2009 00:00      11790     381830  034.00          0
 
6 rows selected.
ojo77 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/04/2011, 15h55   #9
Invité régulier
 
Inscription : février 2011
Messages : 41
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 41
Points : 8
Points : 8
Merci pour l'info je vais tester ça
NarbOni est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 16h03   #10
Membre chevronné
 
Homme O. Joly
Support
Inscription : décembre 2010
Messages : 287
Détails du profil
Informations personnelles :
Nom : Homme O. Joly
Âge : 38
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Support
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2010
Messages : 287
Points : 617
Points : 617
Et donc pour ajouter des lignes dans une table titi crée sur le même modèle que notre table externe


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
SQL> CREATE TABLE titi AS SELECT * FROM xtern_table WHERE 1=2
  2  /
 
TABLE created.
 
SQL> DESC titi
 Name                                                                                   NULL?    Type
 -------------------------------------------------------------------------------------- -------- ----------------------------------------------------------
 ID_VILLE                                                                                        VARCHAR2(6)
 VILLE                                                                                           VARCHAR2(50)
 DATE_QVB                                                                                        DATE
 CODE1                                                                                           NUMBER(8,2)
 CODE2                                                                                           NUMBER(8,2)
 CODE3                                                                                           NUMBER(5)
 CODE4                                                                                           NUMBER(2,1)
 
SQL> INSERT /*+ append */ INTO titi SELECT * FROM xtern_table
  2  /
 
6 rows created.
 
SQL> commit;
 
Commit complete.
 
SQL> SELECT * FROM titi
  2  /
 
ID_VIL VILLE                                              DATE_QVB       CODE1      CODE2      CODE3      CODE4
------ -------------------------------------------------- --------- ---------- ---------- ---------- ----------
010130 MIRIBEL LES ECHETS AM                              31-DEC-04                342010         37          0
010150 BOURG EN BRESSE ATM                                              752800     540750         39          0
010230 CHATILLON BELLEGARDE PPDC                                         11790     381830         34          0
010250 BELLEY PPDC                                                       11790     381830         34          0
010265 BAGE LE CHATEL EAR GP                                            731770     693910         38          0
010270 CEYZERIAT CC-T1                                    16-FEB-09      11790     381830         34          0
 
6 rows selected.
ojo77 est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h46.


 
 
 
 
Partenaires

Hébergement Web