Extraction table d'une base de données SQL

Fermé
jerome_jay Messages postés 32 Date d'inscription mardi 11 mars 2008 Statut Membre Dernière intervention 21 juillet 2008 - 13 mars 2008 à 08:56
jerome_jay Messages postés 32 Date d'inscription mardi 11 mars 2008 Statut Membre Dernière intervention 21 juillet 2008 - 13 mars 2008 à 14:22
Bonjour,

je veux trouver un moyen pour exporter des tables d'une base de données SQL en fichier de données txt.... et ceci de façon automatique. si quelqu'un à des idées je si preneur.

4 réponses

jerome_jay Messages postés 32 Date d'inscription mardi 11 mars 2008 Statut Membre Dernière intervention 21 juillet 2008
13 mars 2008 à 14:22
quelqu'un a une autre idée ?
0
freto Messages postés 1542 Date d'inscription vendredi 6 juillet 2007 Statut Membre Dernière intervention 8 avril 2016 161
13 mars 2008 à 08:59
Bonjour a toi.
Tout dépend comment tu veut le faire. Un mysql dump peut faire ce que tu recherche, mais il faut préciser un peu ta demande.
-2
jerome_jay Messages postés 32 Date d'inscription mardi 11 mars 2008 Statut Membre Dernière intervention 21 juillet 2008
13 mars 2008 à 09:01
je voudrais le faire sous forme d'une procédure qui se ferait automatique lorsque je lance mon script

j'ai écrit un script en ksh (korn shell)permettant de demander a l'utilisateur dans quel contexte il souhaite se placer, puis s'il veut supprimer des fichiers txt. Suite a cela j'utilise une commande sqlplus dans ce même script. la commande sqlplus envoi vers un fichier sql.

Jusque la tout va bien ^^

le problème arrive maintenant.

Je voudrais écrire une procédure permettant de faire des extraction de tables d'une base de données et de transformer ces tables extraites en fichiers txt. le soucis c'est que je ne vois pas comment faire.
-1
freto Messages postés 1542 Date d'inscription vendredi 6 juillet 2007 Statut Membre Dernière intervention 8 avril 2016 161
13 mars 2008 à 09:22
Ben un moyen possible est de faire un dump de ta bdd dans un fichier txt, et de traiter ce fichier (très long et très fastidieux).
Sinn lorsque tu te connecte à ta bdd, tu doit avoir moyen d'ajouter une requete en entrée de connexion, et elle s'exécute puis quitte la connexion. Du coup, si elle écrit sur la sortie standard le résultat d'un select, tu redirige cette sortie dans un fichier
-2
jerome_jay Messages postés 32 Date d'inscription mardi 11 mars 2008 Statut Membre Dernière intervention 21 juillet 2008
13 mars 2008 à 09:31
tu n'aurais pas un début de code, car je t'avoue que la je suis dans le flou.

j'avais réussi à trouver ça sur le net:

CREATE OR REPLACE PROCEDURE Extraction_Table
(
PC$Table in Varchar2, -- Nom de la table a extraire
PC$Fichier in Varchar2, -- Nom du fichier de sortie
PC$Repertoire in Varchar2, -- Nom du directory de sortie
PC$Separateur in Varchar2 Default ',', -- Caractere de separation
PC$Entetes in Varchar2 Default 'O', -- Affichage de l'entete des colonnes
PC$DateFMT in Varchar2 Default 'DD/MM/YYYY', -- Format des dates
PC$Where in Varchar2 Default Null, -- Clause Where de filtrage
PC$Order in Varchar2 Default Null -- Colonne de tri
) IS


LF$Fichier UTL_FILE.FILE_TYPE ;
LC$Ligne Varchar2(32767) ;
LI$I Integer ;
LC$DateFMT Varchar2(40) := '''' || PC$DateFMT || '''' ;


TYPE REFCUR1 IS REF CURSOR ;
cur REFCUR1;


-- Colonnes de la table --
CURSOR C_COLTAB ( PC$Tab IN VARCHAR2 ) IS
SELECT
COLUMN_NAME,
DATA_TYPE
FROM
USER_TAB_COLUMNS
WHERE
TABLE_NAME = PC$Tab
AND
DATA_TYPE IN ('CHAR','VARCHAR2','NUMBER','DATE','FLOAT')
;

LC$Separateur Varchar2(2) := PC$Separateur ;
LC$Requete Varchar2(10000) ;
LC$Desc Varchar2(10000) ;
LC$SQLW VARCHAR2(10000):= 'SELECT ';
LC$Col VARCHAR2(256);


-----------------------------------------
-- Ouverture d'un fichier d'extraction --
-----------------------------------------
FUNCTION Ouvrir_fichier
(
PC$Dir in Varchar2,
PC$Nom_Fichier in Varchar2
) RETURN UTL_FILE.FILE_TYPE
IS
Fichier UTL_FILE.FILE_TYPE ;
LC$Msg Varchar2(256);

Begin

Fichier := UTL_FILE.FOPEN( PC$Dir, PC$Nom_Fichier, 'W', 32764 ) ;

If not UTL_FILE.IS_OPEN( Fichier ) Then
LC$Msg := 'Erreur ouverture du fichier (' || PC$Dir || ') ' || PC$Nom_Fichier ;
RAISE_APPLICATION_ERROR( -20100, LC$Msg ) ;
End if ;

Return( Fichier ) ;

Exception

When UTL_FILE.INVALID_PATH Then
LC$Msg := PC$Dir || PC$Nom_Fichier || ' : ' || 'File location is invalid.';
RAISE_APPLICATION_ERROR( -20070, LC$Msg ) ;
When UTL_FILE.INVALID_MODE Then
LC$Msg := PC$Dir || PC$Nom_Fichier || ' : ' || 'The open_mode parameter in FOPEN is invalid.';
RAISE_APPLICATION_ERROR( -20070, LC$Msg ) ;
When UTL_FILE.INVALID_FILEHANDLE Then
LC$Msg := PC$Dir || PC$Nom_Fichier || ' : ' || 'File handle is invalid.';
RAISE_APPLICATION_ERROR( -20070, LC$Msg ) ;
When UTL_FILE.INVALID_OPERATION Then
LC$Msg := PC$Dir || PC$Nom_Fichier || ' : ' || 'File could not be opened or operated on as requested.';
RAISE_APPLICATION_ERROR( -20070, LC$Msg ) ;
When UTL_FILE.READ_ERROR Then
LC$Msg := PC$Dir || PC$Nom_Fichier || ' : ' || 'Operating system error occurred during the read operation.';
RAISE_APPLICATION_ERROR( -20070, LC$Msg ) ;
When UTL_FILE.WRITE_ERROR Then
LC$Msg := PC$Dir || PC$Nom_Fichier || ' : ' || 'Operating system error occurred during the write operation.';
RAISE_APPLICATION_ERROR( -20070, LC$Msg ) ;
When UTL_FILE.INTERNAL_ERROR then
LC$Msg := PC$Dir || PC$Nom_Fichier || ' : ' || 'Unspecified PL/SQL error';
RAISE_APPLICATION_ERROR( -20070, LC$Msg ) ;
When UTL_FILE.CHARSETMISMATCH Then
LC$Msg := PC$Dir || PC$Nom_Fichier || ' : ' || 'A file is opened using FOPEN_NCHAR,'
|| ' but later I/O operations use nonchar functions such as PUTF or GET_LINE.';
RAISE_APPLICATION_ERROR( -20070, LC$Msg ) ;
When UTL_FILE.FILE_OPEN Then
LC$Msg := PC$Dir || PC$Nom_Fichier || ' : ' || 'The requested operation failed because the file is open.';
RAISE_APPLICATION_ERROR( -20070, LC$Msg ) ;
When UTL_FILE.INVALID_MAXLINESIZE Then
LC$Msg := PC$Dir || PC$Nom_Fichier || ' : ' || 'The MAX_LINESIZE value for FOPEN() is invalid;'
|| ' it should be within the range 1 to 32767.';
RAISE_APPLICATION_ERROR( -20070, LC$Msg ) ;
When UTL_FILE.INVALID_FILENAME Then
LC$Msg := PC$Dir || PC$Nom_Fichier || ' : ' || 'The filename parameter is invalid.';
RAISE_APPLICATION_ERROR( -20070, LC$Msg ) ;
When UTL_FILE.ACCESS_DENIED Then
LC$Msg := PC$Dir || PC$Nom_Fichier || ' : ' || 'Permission to access to the file location is denied.';
RAISE_APPLICATION_ERROR( -20070, LC$Msg ) ;
When UTL_FILE.INVALID_OFFSET Then
LC$Msg := PC$Dir || PC$Nom_Fichier || ' : ' || 'The ABSOLUTE_OFFSET parameter for FSEEK() is invalid;'
||' it should be greater than 0 and less than the total number of bytes in the file.';
RAISE_APPLICATION_ERROR( -20070, LC$Msg ) ;
When UTL_FILE.DELETE_FAILED Then
LC$Msg := PC$Dir || PC$Nom_Fichier || ' : ' || 'The requested file delete operation failed.';
RAISE_APPLICATION_ERROR( -20070, LC$Msg ) ;
When UTL_FILE.RENAME_FAILED Then
LC$Msg := PC$Dir || PC$Nom_Fichier || ' : ' || 'The requested file rename operation failed.';
RAISE_APPLICATION_ERROR( -20070, LC$Msg ) ;

When others Then
LC$Msg := 'Erreur : ' || To_char( SQLCODE ) || ' sur ouverture du fichier ('
|| PC$Dir || ') ' || PC$Nom_Fichier ;
RAISE_APPLICATION_ERROR( -20070, LC$Msg ) ;

End Ouvrir_fichier ;

Begin

-- Ouverture du fichier --
LF$Fichier := Ouvrir_fichier( PC$Repertoire, PC$Fichier ) ;

-- Affichage des entetes de colonne ? --
If Upper(PC$Entetes) = 'O' Then
LI$I := 1 ;
For COLS IN C_COLTAB( PC$Table ) Loop
If LI$I = 1 Then
LC$Ligne := LC$Ligne || COLS.COLUMN_NAME ;
Else
LC$Ligne := LC$Ligne || LC$Separateur || COLS.COLUMN_NAME ;
End if ;
LI$I := LI$I + 1 ;
End loop ;
-- Ecriture ligne entetes --
UTL_FILE.PUT_LINE( LF$Fichier, LC$Ligne ) ;
ElsIf Upper(PC$Entetes) = 'I' Then
LC$Separateur := ',' ;
LC$Desc := 'INSERT INTO ' || PC$Table || ' (' ;
LI$I := 1 ;
For COLS IN C_COLTAB( PC$Table ) Loop
If LI$I = 1 Then
LC$Desc := LC$Desc || COLS.COLUMN_NAME ;
Else
LC$Desc := LC$Desc || LC$Separateur || COLS.COLUMN_NAME ;
End if ;
LI$I := LI$I + 1 ;
End loop ;
LC$Desc := LC$Desc || ' ) VALUES (' ;
End if ;

-- Construction de la requete --
LI$I := 1 ;

FOR COLS IN C_COLTAB( PC$Table ) LOOP
IF LI$I > 1 THEN
LC$SQLW := LC$SQLW || '||' ;
END IF ;

If COLS.DATA_TYPE IN ('NUMBER','FLOAT') Then
LC$Col := 'Decode(' || COLS.COLUMN_NAME || ',NULL, ''NULL'',To_char("'
|| COLS.COLUMN_NAME || '"))' ;
ElsIf COLS.DATA_TYPE = 'DATE' Then
If Upper(PC$Entetes) = 'I' Then
LC$Col := 'Decode(' || COLS.COLUMN_NAME || ',NULL,''NULL'',''to_date(''''''||'
|| 'To_char("' || COLS.COLUMN_NAME || '",'|| LC$DateFMT ||')' || '||'''''','''|| LC$DateFMT||''')'')' ;
Else
LC$Col := 'To_char("'|| COLS.COLUMN_NAME || '",'|| LC$DateFMT ||')' ;
End if ;
Else
If Upper(PC$Entetes) = 'I' Then
LC$Col := 'Decode(' || COLS.COLUMN_NAME || ',NULL, ''NULL'',' || ''''''''''
|| '|| REPLACE("'|| COLS.COLUMN_NAME || '",CHR(39),CHR(39)||CHR(39))' || '||' || ''''''''')' ;
Else
LC$Col := '"'|| COLS.COLUMN_NAME || '"' ;
End if ;
End if ;

IF LI$I = 1 THEN
LC$SQLW := LC$SQLW || LC$Col ;
ELSE
LC$SQLW := LC$SQLW || '''' || LC$Separateur || '''' || '||' || LC$Col ;
END IF ;
LI$I := LI$I + 1 ;
END LOOP ;

LC$Requete := LC$SQLW || ' FROM ' || PC$Table ;

If PC$Where is not null Then
-- ajout de la clause WHERE --
LC$Requete := LC$Requete || ' WHERE ' || PC$Where ;
End if ;
If PC$Order is not null Then
-- ajout de la clause ORDER BY --
LC$Requete := LC$Requete || ' ORDER BY ' || PC$Order ;
End if ;

F_TRACE( LC$Requete, 'T' ) ;
-- Extraction des lignes --
Open cur For LC$Requete ;
Loop
Fetch cur Into LC$Ligne ;
Exit when cur%NOTFOUND ;
-- Ecriture du fichier de sortie --
If Upper(PC$Entetes) = 'I' Then
UTL_FILE.PUT_LINE( LF$Fichier, LC$Desc || LC$Ligne || ' );' ) ;
Else
UTL_FILE.PUT_LINE( LF$Fichier, LC$Ligne ) ;
End if ;
End loop ;

Close cur ;

-- Fermeture fichier --
UTL_FILE.FCLOSE( LF$Fichier ) ;

End ;
/
-1
freto Messages postés 1542 Date d'inscription vendredi 6 juillet 2007 Statut Membre Dernière intervention 8 avril 2016 161
13 mars 2008 à 09:37
Alors niveau code, franchement je peut pas aider sur ce coup la, sa fait lontemps que je n'ai pas taté de sql. De plus tout ce qui est la n'est pas commenté, et donc je n'ai pas la matinée pour te renseigner plus, ou te dire si ce code est bon/pas bon/quoi modifier.
Vacanciers, à vos méninges!! ;)
-2
jerome_jay Messages postés 32 Date d'inscription mardi 11 mars 2008 Statut Membre Dernière intervention 21 juillet 2008
13 mars 2008 à 09:42
voila mon problème, il n'est pas commenté et je suis pas un crack en prog donc je sais pas ce qui me concerne ou non

merci qd meme de ton aide ^^
-1