Précédent   Forum des professionnels en informatique > Bases de données > Firebird
Firebird Forum d'entraide sur le SGBD Firebird. Avant de poster -> F.A.Q Firebird, Tutoriels
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 22/08/2005, 22h18   #1
Rédacteur
 
Inscription : mai 2002
Messages : 40
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 40
Points : 23
Points : 23
Par défaut Import massif/table externe et real

Bonjour,

Je souhaite faire une importation massive (10.000.000 lignes) dans une table. J'ai consulté le précédent thread sur le sujet ainsi que le tutorial associé

Toutefois, je ne sais pas comment faire ma table externe avec des nombres réels à l'intérieur tout en conservant l'alignement. Ma table est définie par
Code :
1
2
3
4
5
6
7
8
9
10
11
 
CREATE TABLE "WAYPOINTS" 
(
  "ID_WAYPOINT"	 INTEGER NOT NULL,
  "WP_NOM"	 CHAR(8) CHARACTER SET ASCII NOT NULL,
  "WP_COMMENTAIRE"	 VARCHAR(20) CHARACTER SET ISO8859_1,
  "WP_LATITUDE"	 DOUBLE PRECISION NOT NULL,
  "WP_LONGITUDE"	 DOUBLE PRECISION NOT NULL,
  "WP_ALTITUDE"	 INTEGER,
CONSTRAINT "PK_WAYPOINTS" PRIMARY KEY ("ID_WAYPOINT")
);
Je fais comment avec les DOUBLE PRECISION? et INTEGER d'ailleurs aussi?
Eric Sibert est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2005, 21h47   #2
Rédacteur
 
Inscription : mai 2002
Messages : 40
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 40
Points : 23
Points : 23
Je me fais moi même la réponse. En fait, on décide juste de la longueur qu'on veut. Et on fait ensuite des varchar à la longueur correspondante.

Par exemple, j'avais des real pas très précis à importer. J'ai mis ça dans mon générateur de fichier à importer :

Code :
1
2
 
writeln(Dest,Format('%.8d%9.6f%9.6f', [N,Real1,Real2]));
Ca fait un entier sur 8 chiffres. Et des réels avec 9 caractères dont 6 chiffres après la virgule (mes réels sont entre -1 et 1).

Ensuite, la séquence SQL :
Code :
1
2
3
4
5
6
7
 
CREATE TABLE "T_EXTERNAL" EXTERNAL FILE 'C:\Documents and Settings\Eric\Bureau\test.txt'
(
	"ID"          char(8),
	"REAL1"            char(9),
	"REAL2"          char(9),
);
Ca marche bien sous Windows en local. Par contre, je n'arrive pas à le faire fonctionner sous Linux/FB1.5 ...
Eric Sibert est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2005, 11h05   #3
Expert Confirmé Sénior
 
Avatar de qi130
 
Homme Pierre
Ingénieur qualité méthodes
Inscription : mars 2003
Messages : 3 726
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Ingénieur qualité méthodes
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 3 726
Points : 4 739
Points : 4 739
Dans le tuto, il est fait mention de:

1/ la modif du fichier de configuration de FB, en as-tu tenu compte ?

2/ la nécessité de décrire, dans la table externe, les caractères de fin de ligne : #13#10 en windows, mais uniquement #10 sous unix. Je ne les vois pas dans ton create table...
__________________
"Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
-----------------------
Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
Usus magister est optimus
qi130 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2005, 14h02   #4
Rédacteur
 
Inscription : mai 2002
Messages : 40
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 40
Points : 23
Points : 23
Oui, pardon, j'ai un peu simplifié mon exemple mais il y a bien un varchar(2) à la fin pour le retour à la ligne. Et ceci même sous Linux car j'ai généré le fichier sous Windows et il contient toujours #13#10 à la fin de chaque ligne.

J'ai aussi mis ExternalFileAccess = Full dans le firebird.conf de mon serveur. De même que j'ai fait un chmod 777 sur mon fichier externe pour que tout le monde puisse y accéder.
Eric Sibert est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2005, 21h30   #5
Rédacteur
 
Inscription : mai 2002
Messages : 40
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 40
Points : 23
Points : 23
Pour les retours à la ligne, je confirme qu'il suffit d'être cohérent entre le fichier généré et la structure de la table. J'ai poussé le vice jusqu'à ne pas mettre de retour à la ligne dans mon fichier puis d'importer par
Code :
1
2
3
4
5
6
7
8
9
10
 
CREATE TABLE T_EXTERNAL EXTERNAL FILE '/opt/firebird/perso/france.txt'
(
    ID_WP          char(8),
    NOM            char(8),
    COMMENTAIRE    char(20),
    LAT            char(9),
    LONGI          char(9),
    ALTI           char(5)
);
C'est bon.

Pour mon problème, il fallait redémarrer firebird pour prendre en compte ExternalFileAccess = Full.
Eric Sibert est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2005, 21h57   #6
Rédacteur
 
Inscription : janvier 2004
Messages : 2 123
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : janvier 2004
Messages : 2 123
Points : 1 977
Points : 1 977
Salut,

Citation:
Envoyé par Eric Sibert
Pour mon problème, il fallait redémarrer firebird pour prendre en compte ExternalFileAccess = Full.
Merci pour le retour d'information.
Je vais modifier cela dès que possible.

Sujet résolu ?
__________________
Ancien pseudo : yobenzen

Recherche un emploi de Chef de Projet ou Développeur en Normandie
Delphi/Oracle/Interbase
Migration vers symfony

CV :
- LinkedIn
- Viadeo
Benjamin GAGNEUX est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2005, 23h26   #7
Rédacteur
 
Inscription : mai 2002
Messages : 40
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 40
Points : 23
Points : 23
Oui, sujet résolu. J'ai réussi à importer mes 5 millions de ligne

Par contre, le coup de redémarrer firebird n'a pas été si simple que ça. Sous Linux, la méthode n'est pas la même si on est en Classic ou en SuperServer. J'étais dans le second cas. Il fallait faire un
Code :
1
2
 
service firebird restart
Sauf que ça refusait pour des problèmes de mot de passe. Car le mot de passe est stocké en dur dans le script de redémarrage ainsi appelé (qui se trouve en /etc/init.d). Et moi j'avais changé le mot de passe alors le script n'était plus à jour.

Si ça peut aider les suivant. En tout cas, ton tutoriel m'a bien aidé
Eric Sibert est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2005, 10h13   #8
Rédacteur
 
Inscription : mai 2002
Messages : 40
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 40
Points : 23
Points : 23
Un dernier message pour compléter.

A la fin, quand vous avez terminé toutes vos importations, n'oubliez pas de remettre le ExternalFileAccess = None (et de redémarrer FireBird ) car c'est une grosse source de vulnérabilité les tables externes.


PS : en fait, en version Classic, il n'y a pas à redémarrer le serveur vu que rien ne tourne et qu'une nouvelle instance est démarrée à chaque requête/connexion.
Eric Sibert est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h53.


 
 
 
 
Partenaires

Hébergement Web