Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour 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/12/2007, 09h35   #1
Membre éprouvé
 
Homme
Consultant en Business Intelligence
Inscription : mai 2003
Messages : 910
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : mai 2003
Messages : 910
Points : 407
Points : 407
Par défaut [Débutant] Extraction de données en CSV ?

Bonjour à tous,

voilà comme d'hab on me demande à moi ce que personne ne sait faire ici !!!

J'ai une requête SQL à laquelle je dois passer un paramètre, puis insérer les données qui en ressortent au sein de 4 fichiers .csv. En effet, une des conditions de la clause where possède 4 valeurs (connues) possibles.

Idée 1 : Faire boucler ma requête sur ces 4 valeurs et insérer les résultats dans un fichier csv ? Mais, ceci va m'obliger à exécuter 4 fois la même requête (à 1 détail prêt) !

Idée 2 : Exécuter la requête sans la condition "changeante" et exécuter une 2e requête sur le résultat de la 1ère permettant d'appliquer uniquement la fameuse condition (au sein d'une boucle afin de passer les non moins fameuses 4 valeurs) ? C'est possible ça ?!


Merci d'avance de me guider dans le droit chemin !?
__________________
Quand on n'a pas d'tête, on a ...
ghohm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 09h38   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
tu peux aussi insérer le résultat dans une table temporaire avec une colonne qui spécifie le nom du fichier destination et ensuite spooler dans les fichiers ad hoc
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 09h50   #3
Membre éprouvé
 
Homme
Consultant en Business Intelligence
Inscription : mai 2003
Messages : 910
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : mai 2003
Messages : 910
Points : 407
Points : 407
Citation:
Envoyé par orafrance Voir le message
tu peux aussi insérer le résultat dans une table temporaire avec une colonne qui spécifie le nom du fichier destination et ensuite spooler dans les fichiers ad hoc
Ah oui super ...







... mais t'aurais pas un exemple ?!
__________________
Quand on n'a pas d'tête, on a ...
ghohm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 10h03   #4
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
INSERT AS SELECT et UTL_FILE ou SPOOL sont tes amis
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 14h21   #5
Membre éprouvé
 
Homme
Consultant en Business Intelligence
Inscription : mai 2003
Messages : 910
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : mai 2003
Messages : 910
Points : 407
Points : 407
Citation:
Envoyé par orafrance Voir le message
INSERT AS SELECT et UTL_FILE ou SPOOL sont tes amis
OK pour "INSERT AS SELECT" par contre je n'arrive pas à trouver d'exemples concernant un SPOOL fonctionnant au sein d'une boucle ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var [4] = {1,2,3,6};
 
Début boucle
SPOOL mon_fichier_&var..csv
-- L'entête
SELECT 'code;volet;code_2;code_3;date_semaine'
FROM dual;
 
-- La requête dont les résultats seront séparés par des ";" (CSV)
SELECT '03;' ||
       'V' || tmp.tatatatatata ||';'||
       SUBSTR(tmp.ryryryryryryryr, 1, 9) ||';'||
       tmp.ryryryryryryryryr ||';'||
       tmp.vbvbvbvbvbvbvbvbv
FROM tmp_stats tmp
WHERE tmp.azazazazazaza = &var;
 
SPOOL OFF
Fin Boucle
END
C'est beau nan ? C'est un algo PL/SQLien !

Il me faut 4 fichiers de sortie. Il faudrait que je stocke les valeurs "1", "2", "3" et "6" dans une variable ("var") de type tableau (ou autre) et que je boucle jusqu'à la fin de ce tableau.

Malheureusement, je n'ai pas la moindre idée de comment faire ça en SQL ?!!
__________________
Quand on n'a pas d'tête, on a ...
ghohm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 14h24   #6
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
utilise UTL_FILE
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 14h26   #7
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 453
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 453
Points : 4 215
Points : 4 215
C'est quoi la différence entre les requetes pour les différentes valeurs ?
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 14h39   #8
Membre éprouvé
 
Homme
Consultant en Business Intelligence
Inscription : mai 2003
Messages : 910
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : mai 2003
Messages : 910
Points : 407
Points : 407
Citation:
Envoyé par McM Voir le message
C'est quoi la différence entre les requetes pour les différentes valeurs ?
Pardon !

Je modifie mon post précédent en ajoutant la condition !
__________________
Quand on n'a pas d'tête, on a ...
ghohm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 14h43   #9
Membre éprouvé
 
Homme
Consultant en Business Intelligence
Inscription : mai 2003
Messages : 910
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : mai 2003
Messages : 910
Points : 407
Points : 407
Citation:
Envoyé par orafrance Voir le message
utilise UTL_FILE
Ça me parait être bien compliqué !

Et puis je comprends pas pourquoi je pourrais pas utiliser "SPOOL" à moins que ce soit une histoire de performance ?

Merci d'éclairer ma lanterne !
__________________
Quand on n'a pas d'tête, on a ...
ghohm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 14h58   #10
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 453
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 453
Points : 4 215
Points : 4 215
Vu que de toute façon ta requete sera exécutée 4 fois :

Soit tu écris 4 fois les spools
+ : Codage Facile
- : Maintenance x 4

Soit tu écris une .sql générique qui prend une donnée en entrée et qui crée le fichier csv, et c'est en dehors du sql que tu fais ta boucle et appelle 4 fois le .sql
+ : Codage générique au cas où il faudrait 5 valeurs
- : 4 appels à sqlplus

Soit tu utilise utl_file, ouvre 4 fichiers. Ensuite tu fais un curseur qui récupère la liste pour les 4 valeurs et en pl/sql, tu insères la ligne dans le fichier que tu veux.
+ : 1 seul curseur
- : Plus long si beaucoup de lignes
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 15h04   #11
Membre éprouvé
 
Homme
Consultant en Business Intelligence
Inscription : mai 2003
Messages : 910
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : mai 2003
Messages : 910
Points : 407
Points : 407
Citation:
Envoyé par McM Voir le message
Vu que de toute façon ta requete sera exécutée 4 fois
Je pensais insérer dans une table temporaire le résultat de ma requête - requête qui s'exécute sur une table de plusieurs millions de lignes - et ensuite consulter cette table temporaire selon une condition à laquelle j'affecterai ma liste de valeurs (voir exemple ci-dessus).

Donc plus de performances, non ?
__________________
Quand on n'a pas d'tête, on a ...
ghohm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 15h13   #12
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 453
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 453
Points : 4 215
Points : 4 215
Tout dépend du nombre de lignes ramenées par rapport au nombre de lignes lues

Tu vas lire ta table complètement, inserer x lignes que tu vas relire 4 fois..
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 15h17   #13
Membre éprouvé
 
Homme
Consultant en Business Intelligence
Inscription : mai 2003
Messages : 910
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : mai 2003
Messages : 910
Points : 407
Points : 407
J'ai une table de départ comportant environ 7 700 000 lignes et je récupèrerai au plus quelques milliers de lignes.
__________________
Quand on n'a pas d'tête, on a ...
ghohm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 15h40   #14
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Citation:
Envoyé par McM Voir le message
Vu que de toute façon ta requete sera exécutée 4 fois
pas avec UTL_FILE

ghohm cherche des exemples, c'est pas si compliqué que ça
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 15h45   #15
Membre éprouvé
 
Homme
Consultant en Business Intelligence
Inscription : mai 2003
Messages : 910
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : mai 2003
Messages : 910
Points : 407
Points : 407
Citation:
Envoyé par orafrance Voir le message
pas avec UTL_FILE

ghohm cherche des exemples, c'est pas si compliqué que ça
Tu parles de ça ?
__________________
Quand on n'a pas d'tête, on a ...
ghohm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 15h53   #16
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
ou plus simplement :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
DECLARE
 
   w_nom_fic         VARCHAR2(100) := 'mon_fichier.log'; 
   w_fic_cre         UTL_FILE.FILE_TYPE;
   w_texte           VARCHAR2(32000) := 'XYZ';
 
  BEGIN
    -- Crée le fichier w_nom_fic dans la directory 'MON_DIR'
    w_fic_cre  := UTL_FILE.FOPEN ( 'MON_DIR',w_nom_fic,'w');
 
    -- Ecrit le contenu de la variable w_texte dans le fichier
    UTL_FILE.PUT (w_fic_cre ,w_texte);
 
    -- Ferme le fichier
    UTL_FILE.FCLOSE(w_fic_cre); 
 
END;
/
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2007, 11h15   #17
Membre éprouvé
 
Homme
Consultant en Business Intelligence
Inscription : mai 2003
Messages : 910
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : mai 2003
Messages : 910
Points : 407
Points : 407
Lorsque j'exécute mon script via cygwin, j'ai l'erreur suivante :

Citation:
SQL> start stats_decl_valid /cygdrive/c/Documents\ and\ Settings/fr256138/Bureau/tmp
ancien 3 : chemin varchar2(100) := &1;
nouveau 3 : chemin varchar2(100) := /cygdrive/c/Documents\;
chemin varchar2(100) := /cygdrive/c/Documents\;
*
ERREUR Ó la ligne 3 :
ORA-06550: Ligne 3, colonne 26 :
PLS-00103: Symbole "/" rencontrÚ Ó la place d'un des symboles suivants :
( - + case mod new not null <identificateur>
<identificateur entre guillemets> <variable bind> avg count
current exists max min prior sql stddev sum variance execute
forall merge time timestamp interval date
<un littÚral de cha¯ne avec spÚcification de jeu de caractÞres>
<un nombre> <une cha¯ne SQL entre apostrophes> pipe
<constante de cha¯ne Úventuellement entre guillemets avec indication du jeu de
caractÞres>
Certainement un problème de guillemets et d'anti-slash (Alt Gr + 8), non ?


Je désespère !
__________________
Quand on n'a pas d'tête, on a ...
ghohm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2007, 12h08   #18
Membre éprouvé
 
Homme
Consultant en Business Intelligence
Inscription : mai 2003
Messages : 910
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : mai 2003
Messages : 910
Points : 407
Points : 407
Après avoir relu en détail la page sur UTL_FILE, je crois que je bosse depuis 2 jours pour rien !

Je dois passer en paramètre le chemin du répertoire dans lequel seront stockés les fichiers de sortie or ce chemin peut pointer vers n'importe où !

J'ai cru comprendre qu'il fallait absolument que ce répertoire soit sur le serveur où est hébergée la BDD et qu'en plus on ait les bons droits !!!

Citation:
Dans les version antérieures, la description des répertoires autorisés était spécifiée dans le paramètre UTL_FILE_DIR du fichier d'initialisation INIT.ORA, dont toute modification imposait évidement un arrêt et relance de la base
Dites moi qu'il y a une méthode de contournement simple et rapide !?
__________________
Quand on n'a pas d'tête, on a ...
ghohm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2007, 13h40   #19
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
je ne me souviens pas de la version de ta base
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2007, 13h43   #20
Membre éprouvé
 
Homme
Consultant en Business Intelligence
Inscription : mai 2003
Messages : 910
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : mai 2003
Messages : 910
Points : 407
Points : 407
Citation:
Envoyé par orafrance Voir le message
je ne me souviens pas de la version de ta base
C'est normal ... je te l'avais pas dit !

C'est la 10g.
__________________
Quand on n'a pas d'tête, on a ...
ghohm 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 07h12.


 
 
 
 
Partenaires

Hébergement Web