Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
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 07/10/2011, 18h06   #1
Nouveau Membre du Club
 
Inscription : mars 2003
Messages : 203
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 203
Points : 38
Points : 38
Par défaut Création d'une table externe

Bonjour,
En faisant des recherches sur le web sur le moyen d'arriver à faire des insertions de plusieurs lignes (BULK INSERT), j'ai trouvé que la table externe est un moyen pour y arriver.
J'ai donc créé un fichier pour stocker mes données. mon problème est que je n'arrive pas à créer ma table externe
Code :
CREATE TABLE temp1 EXTERNAL FILE 'C:\Users\avelompa\Documents\datamining\DataAnalysis\Monitoring\bin\Debug\dt.ext'(field1 TIMESTAMP,field2 VARCHAR(10), field3 float, field4 VARCHAR(250));
Je travaille avec C# et flameRobbin comme outil d'administration de firebird.
Quand je lance ma requête avec flameRobin celui ci plante. Et avec C#, il ne ressort plus du commad.ExecuteNonQuery().
Qu'est ce qui ne fonctionne pas dans requête? Y t-il un moyen de faire une mutli-insertion pour enregistrer des données de 500000 lignes?

Merci pour votre aide
pbatty1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/10/2011, 01h06   #2
Membre chevronné
 
Philippe
Inscription : avril 2002
Messages : 451
Détails du profil
Informations personnelles :
Nom : Philippe
Localisation : France

Informations forums :
Inscription : avril 2002
Messages : 451
Points : 678
Points : 678
Envoyer un message via ICQ à Ph. B.
Bonjour,
  1. Dans le fichier firebird.conf, la propriété ExternalFileAccess a pour valeur par défaut None : Aucune table externe autorisée.
    Pour autoriser toute table externe (cependant, attention à la sécurité !)
    Code :
    ExternalFileAccess = Full
    ou pour autoriser les tables d'un (ou plusieurs) répertoire(s) donné(s)
    Code :
    ExternalFileAccess = Restrict C:\MonRepertoire;C:\Temp
  2. Créer un fichier avec des enregistrements de longueur fixe
  3. Créer la réquête de création de la table
    Code :
    CREATE TABLE temp1 EXTERNAL FILE 'C:\MonRepertoire\dt.ext'(field1 CHAR(19), field2 CHAR(10), field3 CHAR(8), field4 CHAR(250), fieldCRLF CHAR(2));
    La dernière colonne stockera les caractères de retour à la ligne CR/LF
  4. Créer la requête d'insertion
    Code :
    1
    2
    3
    4
    5
    6
    7
    INSERT INTO TABLE_REELLE 
    SELECT
      CAST(field1 AS TIMESTAMP),
      CAST(field2 AS VARCHAR(10)),
      CAST(field3 AS FLOAT),
      CAST(field4 AS VARCHAR(250))
    FROM temp1
--
Philippe.
Ph. B. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2011, 00h09   #3
Nouveau Membre du Club
 
Inscription : mars 2003
Messages : 203
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 203
Points : 38
Points : 38
Merci pour la reponse, mais est ce qu'il est possible d'avoir une adresse relative pour la configuration du externalaccessfile? En effet il se peut que je distribue le logiciel.
pbatty1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2011, 09h55   #4
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 213
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 213
Points : 3 315
Points : 3 315
oui et non
si tu définis par exemple :
Code :
ExternalFileAccess = Restrict C:\MonRepertoire
alors
Code :
CREATE TABLE temp1 EXTERNAL FILE 'dt.ext' ...(
ira chercher dans C:\MonRepertoire
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2011, 11h25   #5
Membre chevronné
 
Philippe
Inscription : avril 2002
Messages : 451
Détails du profil
Informations personnelles :
Nom : Philippe
Localisation : France

Informations forums :
Inscription : avril 2002
Messages : 451
Points : 678
Points : 678
Envoyer un message via ICQ à Ph. B.
Citation:
Envoyé par pbatty1 Voir le message
Merci pour la reponse, mais est ce qu'il est possible d'avoir une adresse relative pour la configuration du externalaccessfile? En effet il se peut que je distribue le logiciel.
Une adresse relative par rapport à quoi ? au répertoire d'installation de Firebird ? au répertoire d'installation de votre application ?
Le moteur Firebird ne peut rien spéculer sur un chemin relatif. Il attend que ce paramètre contienne un (ou des) chemin(s) absolu(s).
cf. la FAQ de Firebird

Quant à l'emplacement du fichier firebird.conf, il est à la racine du répertoire d'installation de Firebird soit pour Firebird 2.5x sous windows XP le chemin par défaut suivant : C:\Program Files\Firebird\Firebird_2_5.
Pour les détails, je te renvoie à la doc anglophone de firebird en suivant ce lien.
--
Philippe.
Ph. B. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2011, 22h08   #6
Nouveau Membre du Club
 
Inscription : mars 2003
Messages : 203
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 203
Points : 38
Points : 38
Ok, il n'est pas évident de mettre l'adresse relative à partir de l'application. Je pense faire un script qui modifie le firebird.config. Mais j'ai un autre souci au niveau de mon fichier externe. J'avais ecrit dans mon fichier les données comme suit
Citation:
2007/03/20 12:30:20 var1 8912.55 hist
2007/03/20 13:30:20 var1 89.23 hist
et avec la definition de la table temp1
Code :
string.Format(@"CREATE TABLE temp1 EXTERNAL FILE '{0}\dt.ext'(field1 CHAR(19),field2 CHAR(10), field3 CHAR(8), field4 CHAR(250),fieldCRLF char(2));", filepath)
j'obtiens des résultats qui ne correspondent psa au format requis car la table découpe selon le nombre de caractères affecté or j'ai des informations avec une taille variable pour field2, le field3 et le field 4
N'y a t-il pas un moyen de définir la ligne d'enregistrement et les données de chaque champ?
pbatty1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2011, 23h39   #7
Membre chevronné
 
Philippe
Inscription : avril 2002
Messages : 451
Détails du profil
Informations personnelles :
Nom : Philippe
Localisation : France

Informations forums :
Inscription : avril 2002
Messages : 451
Points : 678
Points : 678
Envoyer un message via ICQ à Ph. B.
Le fichier doit avoir des lignes de longueur fixe pour pouvoir le traiter comme une table externe.

Chaque colonne doit être typée CHAR(n). Il suffit de la "caster" ensuite au bon format.

Pour ton exemple en longueur fixe :
Citation:
2007/03/20 12:30:20 var1 8912.55 hist
2007/03/20 13:30:20 var1 89.23 hist
On pourrait écrire :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE TABLE temp1 EXTERNAL FILE 'C:\Temp\dt.ext'
(
field1 CHAR(19),
fieldsep1 CHAR(1),
field2 CHAR(4),
fieldsep2 CHAR(1),
field3 CHAR(7),
fieldsep3 CHAR(1),
field4 CHAR(4),
fieldCRLF char(2)
);
--
SELECT
  CAST(field1 AS TIMESTAMP) AS F1,
  CAST(field2 AS VARCHAR(4)) AS F2,
  CAST(field3 AS FLOAT) AS F3,
  CAST(field4 AS VARCHAR(4)) AS F4
FROM temp1
--
Philippe.
Ph. B. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2011, 14h40   #8
Nouveau Membre du Club
 
Inscription : mars 2003
Messages : 203
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 203
Points : 38
Points : 38
Si on prend la requête
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE TABLE temp1 EXTERNAL FILE 'C:\Temp\dt.ext'
(
field1 CHAR(19),
fieldsep1 CHAR(1),
field2 CHAR(4),
fieldsep2 CHAR(1),
field3 CHAR(7),
fieldsep3 CHAR(1),
field4 CHAR(4),
fieldCRLF char(2)
);
--
SELECT
  CAST(field1 AS TIMESTAMP) AS F1,
  CAST(field2 AS VARCHAR(4)) AS F2,
  CAST(field3 AS FLOAT) AS F3,
  CAST(field4 AS VARCHAR(4)) AS F4
FROM temp1
elle marchera pour la 1ere ligne mais pas pour 2eme ligne. La 2eme ligne donnera
Citation:
field1=2007/03/20 13:30:20
fieldsep1=
field2=var1
fieldsep2=
field3=89.23 h
fieldsep3=i
field4=st
Dans mon fichier il se trouve que les données qui iront dans field3 et field4 seront de taille variable.
Est ce qu-il est donc impossible pour moi d'utiliser le fichier externe pour mes données?
pbatty1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2011, 15h03   #9
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 213
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 213
Points : 3 315
Points : 3 315
Citation:
Envoyé par pbatty1 Voir le message
Dans mon fichier il se trouve que les données qui iront dans field3 et field4 seront de taille variable.
Est ce qu-il est donc impossible pour moi d'utiliser le fichier externe pour mes données?
oui
les tables externes utilisent des fichiers de taille fixe

soit tu transformes tes fichiers, sois tu utilises une autre solution
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2011, 20h53   #10
Nouveau Membre du Club
 
Inscription : mars 2003
Messages : 203
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 203
Points : 38
Points : 38
Pour l'instant je transforme les données. mais y at il un autre moyen aussi rapide pour faire des grosses insertions comme
Code :
INSERT INTO DATA (field1,field2,field3,field4) VALUES ((value1,value2,value3,value4),(value5,value5,value6,value8),...)
Je sais que ce type de requête ne marche pas sur Firebird mais existe t-il le même principe avec un autre syntaxe. J'ai déjà essayé le type d'insertion suivant
Code :
INSERT INTO DATA (field1, field2,field3,field4) SELECT(value1,value2,value3,value4) FROM rdb$database UNION SELECT(value5,value5,value6,value8) FROM rdb$database ...)
Mais l'union est limitée à 125
pbatty1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2011, 12h29   #11
Membre chevronné
 
Philippe
Inscription : avril 2002
Messages : 451
Détails du profil
Informations personnelles :
Nom : Philippe
Localisation : France

Informations forums :
Inscription : avril 2002
Messages : 451
Points : 678
Points : 678
Envoyer un message via ICQ à Ph. B.
Pour le 1° cas, une liste d'insert englobé dans une transaction

Pour le 2° cas, peut-être en utilisent une vue ou un CTE...
--
Philippe.
Ph. B. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2011, 12h56   #12
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 213
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 213
Points : 3 315
Points : 3 315
Citation:
Envoyé par pbatty1 Voir le message
Pour l'instant je transforme les données. mais y at il un autre moyen
dbfile ?
http://www.ibphoenix.com/products/software/dbfile
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2011, 16h27   #13
Nouveau Membre du Club
 
Inscription : mars 2003
Messages : 203
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 203
Points : 38
Points : 38
Citation:
Pour le 1° cas, une liste d'insert englobé dans une transaction
J'ai utilisé la méthode suivante pour insérer mes données
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sql ="INSERT INTO DATA (field1, field2,field3,field4)
VALUES (?,?,?,?)"
command.CommandText=sql;
transac = con.BeginTransaction(IsolationLevel.RepeatableRead);
command.Transaction = transac;
FOR(int i=0;i<LIMIT;i++)
{
command.Parameters.AddWithValues("field1",value1);
command.Parameters.AddWithValues("field2",value2);
command.Parameters.AddWithValues("field3",value3);
command.Parameters.AddWithValues("field4",value4);
commad.ExecuteNonQuery();
command.Paramters.Clear();
}
transac.Commit();
Mais le résultat de l'insertion est lent
Citation:
Pour le 2° cas, peut-être en utilisent une vue ou un CTE...
Je vais me renseigner sur cette piste
Pour dbfile je ferai un test sur son efficacité, car si il peut parser le fichier externe ca pourrait m'être utile pour d'autres insertion
pbatty1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h34.


 
 
 
 
Partenaires

Hébergement Web