Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels 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 24/08/2007, 10h52   #1
Membre du Club
 
Inscription : juillet 2003
Messages : 137
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 137
Points : 48
Points : 48
Envoyer un message via MSN à crocodingo
Par défaut Ecriture dans plusieurs fichier

Bonjour,

j'ai un problème d'écriture dans un fichier avec le DBMS_OUTPUT.PUT_LINE().
j'ai positionné "dbms_output.enable(1000000);" mais cela n'est pas sufisant.

Je voulais savoir s'il était possible de découper le resultat de ma requete SQL pour l'écrire dans plusieurs fichier.

Actuellement je fais un "SPOOL nom_du_fichier" avant mes declarations de variable, et un SPOOL OFF a la fin de mon fichier.

Merci d'avance.
crocodingo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2007, 10h54   #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
ce serait bien d'être plus précis

Tu fais du SQL ou PL/SQL ? Tu peux pas utiliser UTL_FILE ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2007, 11h03   #3
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : Conseil

Informations forums :
Inscription : janvier 2004
Messages : 2 866
Points : 3 448
Points : 3 448
Citation:
Envoyé par orafrance Voir le message
ce serait bien d'être plus précis
et de préciser la version
__________________
Un problème sans solution est un problème mal posé

Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2007, 11h13   #4
Membre du Club
 
Inscription : juillet 2003
Messages : 137
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 137
Points : 48
Points : 48
Envoyer un message via MSN à crocodingo
je fais du pl sql,

j'ai essayé d'utilisé UTL_FILE mais sans succès (je m'en suis jamais servis auparavant donc je sais pas si je m'y prend bien).

Je pense pas que le code soit utile a quoi que ce soit, donc je vais essayé d'etre le plus clair possible:

J'ai un curseur :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
CURSOR C_TEST IS	
	SELECT record_**********************************TO
	FROM (	
	SELECT t.reco*******************************ount AS MONT
	FROM tr**** t,tr***** d
	WHERE t.TR***** = d.TR*****
	AND bu**** LIKE '***%'
	AND IS****** IS NULL
	AND am**** != 0
	AND ((name='********') OR (name='*****') OR (name='******'))) x, 
	(SELECT bu***,max(d****) AS B****
	FROM ac***** a, o****** d 	
	WHERE a.O***** = d.O****** 
	AND name = '*****' 
	GROUP BY bu***) y
	WHERE x.bu**** = y.bu****(+)
	ORDER BY bu*****************;
Cette requete me renvoi a peu pres 900 millions de lignes pour l'instant, mais j'en utilise seulement un pourcent (ce qui reste enorme qd meme).

je parcours donc mes resultat avec
Code :
1
2
3
4
5
6
 
FOR rec IN C_TEST loop
*****
traitement des lignes et ecriture dans fichier si besoin
*****
end loop;
la sa plante car le buffer explose.....

Et moi je voudrais transformer ça en :

Code :
1
2
3
4
5
6
7
8
 
FOR rec IN C_TEST loop
*****
traitement des lignes et ecriture dans fichier si besoin
*****
Si ligne ecrite > 20000 alors changement de fichier de SPOOL
*****
end loop;
Voilou....



Version : oracle 9.2.0.4
crocodingo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2007, 11h20   #5
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
dans ce cas, le plus simple c'est encore d'utiliser une table temporaire.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
FOR rec IN C_TEST loop
*****
traitement des lignes et ecriture dans la TABLE temporaire TAB_TEMP
*****
end loop;
 
end;
/
 
spool ton_fichier
SELECT * FOM TAB_TEMP
spool off
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2007, 11h54   #6
Membre du Club
 
Inscription : juillet 2003
Messages : 137
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 137
Points : 48
Points : 48
Envoyer un message via MSN à crocodingo
ça va me donner quoi de plus ma table temporaire??

sa va qd meme crashé qd j'aurai atteind la limite du buffer.

le probleme avec le spool, c'est que je n'arrive pas a changé la valeur du fichier de sorti pendant le traitement.
crocodingo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2007, 12h10   #7
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
la table temporaire ne consomme pas d'espace disque, elle utilise le TEMP et les données sont supprimé en fin de transaction ou de session.

T'aura pas besoin de plusieurs spool puisque tout tiendra dans un seul fichier... il n'y a pas de buffer si tu spooles le résultat du SELECT dans passer par du PL/SQL. C'est dbms_output qui te limite là.
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2007, 12h36   #8
Membre du Club
 
Inscription : juillet 2003
Messages : 137
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 137
Points : 48
Points : 48
Envoyer un message via MSN à crocodingo
le probleme est que je dois sortir un fichier xml.

Et donc je dois formater mon fichier, du genre:

ma requete est du type:

select a, b, c ,d
from****

et je dois avoir en sorti un fichier du type:

Citation:
<CTR>
<B1>a</B1>
<B2>b</B2>
<B3>c</B3>
.........
.........
</CTR>
donc je peut pas mettre le resultat de ma requete directement dans mon fichier.
crocodingo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2007, 13h39   #9
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
il y a des fonctions XML pour faire ça... j'suis pas super caler dans le domaine mais en tout cas, c'est pas la peine de le faire à la main
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2007, 15h32   #10
Membre du Club
 
Inscription : juillet 2003
Messages : 137
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 137
Points : 48
Points : 48
Envoyer un message via MSN à crocodingo
Bon, j'ai changé de piste et j'utilise 2 table temporaire comme tu m'a expliqué.

mais quad je fait un :

Code :
1
2
3
4
 
SELECT * FROM TAB_TEMP1;
 
SELECT * FROM TAB_TEMP2;
il me met une erreur :

Citation:
select * FROM TAB_TEMP1;
*
ERREUR à la ligne 152 :
ORA-06550: Ligne 152, colonne 1 :
PLS-00428: une clause INTO est attendue dans cette instruction SELECT
ORA-06550: Ligne 154, colonne 1 :
PLS-00428: une clause INTO est attendue dans cette instruction SELECT
je peut pas ecrire direct dans le fichier?
crocodingo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2007, 15h39   #11
Membre du Club
 
Inscription : juillet 2003
Messages : 137
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 137
Points : 48
Points : 48
Envoyer un message via MSN à crocodingo
j'ai placé mon spool et mes requetes select apres le end, et la plus d'erreur mais par contre mon fichier est vide.....

j'ai utiliser un
Code :
 CREATE GLOBAL TEMPORARY TABLE
c'est la bonne commande?
crocodingo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2007, 16h02   #12
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : Conseil

Informations forums :
Inscription : janvier 2004
Messages : 2 866
Points : 3 448
Points : 3 448
Tu ne commites pas ? Sinon suivant l'option choisie pour ta table temporaire, tes données peuvent être effacées.
__________________
Un problème sans solution est un problème mal posé

Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2007, 16h17   #13
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
en PL/SQL la syntaxe est :
Code :
1
2
3
4
 
SELECT colonne
INTO variable
FROM TABLE
orafrance 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 05h02.


 
 
 
 
Partenaires

Hébergement Web