Bonjour à tous,
Je cherche a copier les enregistrements d'une table dans un fichier texte. j'ai trouvé ce lien https://www.developpez.net/forums/d6...table-fichier/ mais il marche pas pour firebird.
Version imprimable
Bonjour à tous,
Je cherche a copier les enregistrements d'une table dans un fichier texte. j'ai trouvé ce lien https://www.developpez.net/forums/d6...table-fichier/ mais il marche pas pour firebird.
Bonjour,
Évidemment puisque dans mySQL !Citation:
mais il marche pas pour firebird.
Il faut utiliser une table externe, voir la documentation https://firebirdsql.org/file/documen...l-tbl-external
OU
Utiliser un GUI, je sais que Flamerobin permet de le faire.
Reste à savoir si c'est un besoin ponctuel ou une procédure à mettre en place
Je veut mettre une procédure qui s’exécute au besoin.Citation:
Reste à savoir si c'est un besoin ponctuel ou une procédure à mettre en place
Bonjour,
Comme d'habitude ce n'est pas les infos fournies qui vous étouffent ! Aucune base de départ (Structure de ce que vous voulez obtenir, de la table de départ) pour travailler n'aide pas !
donc il faut un exemple
une table de départ
une table qui va recevoir le résultatCode:
1
2
3
4
5
6
7
8
9
10
11 CREATE TABLE TABLETEST ( ID INTEGER, TEXTE VARCHAR(20) ); -- avec données INSERT INTO TABLETEST (ID, TEXTE) VALUES ( 1,'AAAAAAAAAAAAAA'); INSERT INTO TABLETEST (ID, TEXTE) VALUES ( 2,'BBBBBBBBBBBB'); INSERT INTO TABLETEST (ID, TEXTE) VALUES ( 3,'CCCCCCCC');
la procédureCode:
1
2
3
4
5
6 CREATE TABLE t1 EXTERNAL FILE 'C:\Livres\Test.TXT' -- Attention 2 conditions un répertoire existant non protégé, une modification de firebird.conf ID CHAR(5), -- remarquez bien le type --évitez d'utiliser autre chose que des chaines de caractères si vous voulez quelque chose de lisible NAME VARCHAR(32), CRLF CHAR(2) -- changement de ligne windows ASCII_CHAR(13)||ASCII_CHAR(10) );
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 SET TERM ^ ; ALTER PROCEDURE OUT_TOTEST RETURNS ( LIGNES Integer ) AS DECLARE VARIABLE AID INTEGER; DECLARE VARIABLE ATEXTE VARCHAR(32); BEGIN LIGNES=0; FOR SELECT ID,TEXTE FROM TABLETEST INTO :AID,:ATEXTE DO BEGIN LIGNES=LIGNES+1; INSERT INTO T1 (ID, NAME,CRLF) VALUES (:AID,:ATEXTE,ASCII_CHAR(13)||ASCII_CHAR(10)); END SUSPEND; END^ SET TERM ; ^
exécution
Code:SELECT p.LIGNES FROM OUT_TOTEST p
ATTENTION ! un fichier non vidé entraine l'ajout des données en fin de fichier
résultat
Pièce jointe 424586
Encore des caractères non lisible ! la faute à : la structure de la table externe (contient des varchar)
en changeant la structure (que des char(xxx)) le remplissage ( LPAD(:AID,'0'), RPAD(:ATEXTE) ) vous vous rapprocherez petit à petit d'un résultat conforme à une transmission de données informatisées "à l'ancienne" : fichier de longueur fixe sans séparateurs.
Bonjour,
Merci pour la réponse j'ai bien compris la méthode. Cependant avec cette méthode on est obligé de créer autant de tables externes que de table d'envoi. Je m'explique, mon but et de pouvoir convertir en fichier texte plusieurs table avec des champs différent pour chaqu'une. Moi j'ai une base de données avec 50 tables donc il faut créer 50 tables externe:?
Bonjour,
J'ai répondu à cette question correspondant au titre
Vous changez les données du problème !
j'ai l'impression que vous avancez au petit bonheur la chance, votre cahier des charges mal défini. Plus ça va plus j'ai l'impression que vous voulez en quelque sorte réinventer le backup, cela ressemble de plus en plus a un DUMP de la base de données, mais uniquement des données !
Savez vous qu'il existe des programmes tout fait comme FBExport qui pourrait peut être convenir ?
(un programme Delphi pourrait aussi convenir)
Enfin rien ne vous empêche de résoudre le problème et utiliser qu'une seule table externe
par exemple :
solution par concaténation
1-la structure de la table externe est à définir en fonction de la taille d'une ligne de la plus grande table
2-trois colonnes seulement pour la table externe : NOMTABLE CHAR(32),DATA VARCHAR(<taille>),CRLF CHAR(2)
:alerte: vous ne pourrez pas utiliser cette table, ou du moins très difficilement , comme table en lectureCode:
1
2 INSERT INTO T1 (NOMTABLE, DATA,CRLF) VALUES SELECT 'MATABLE1',CHAMP1||';'||CHAMP2||';'||CHAMP3,ASCII_CHAR(13)||ASCII_CHAR(10)) FROM MATABLE1 INSERT INTO T1 (NOMTABLE, DATA,CRLF) VALUES SELECT 'MATABLE2',CHAMP1||';'||CHAMP2,ASCII_CHAR(13)||ASCII_CHAR(10)) FROM MATABLE2
chaque champ est à traiter comme CHAR(x) donc nécessite CAST et LPAD,RPAD (encore que cela dépende de ce que vous voulez faire avec)
attention les colonnes contenant des ' ou " pourraient tout faire planter
j'ai mis des ';' pour séparer chaque champ dans la colonne DATA
Salut à tous.
Voici un petit exemple d'export vers une table externe :
Et voici le contenu de la table export :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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 -- =================== -- Vidage Table 'Test' -- =================== select * from test; ID LIB1 LIB2 LIB3 ======= ========== ========== ========== 1 un eins one 2 zwei two 3 trois three 4 quatre vier four 5 cinq funf 13 treize dreizehn thirteen -- =============================== -- Création table externe 'Export' -- =============================== drop table Export; CREATE TABLE Export external 'e:\31.FireBird\30.Table_Externe\Ex_03\Fichier_2.txt' ( id smallint, lb1 varchar(10), lb2 varchar(10), lb3 varchar(10), CRLF char(02) ); -- ================================== -- Remplissage table externe 'Export' -- ================================== insert into Export select id, lib1 as lb1, lib2 as lb2, lib3 as lb3, ASCII_CHAR(13)||ASCII_CHAR(10) as crlf from test; -- ===================== -- Vidage table 'Export' -- ===================== select id, lb1, lb2, lb3 from Export; ID LB1 LB2 LB3 ======= ========== ========== ========== 1 un eins one 2 zwei two 3 trois three 4 quatre vier four 5 cinq funf 13 treize dreizehn thirteen exit; Appuyez sur une touche pour continuer...
Ce n'est pas exactement un fichier texte, mais bon, c'est à vous de gérer vos colonnes par le type char.Code:
1
2
3
4
5
6
7 un eins one zwei two trois three quatre vier four cinq funf treize dreizehn thirteen
@+