Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
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 16/05/2011, 17h57   #1
Futur Membre du Club
 
Inscription : avril 2010
Messages : 54
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 54
Points : 17
Points : 17
Par défaut FSEEK en écriture

Bonjour,
Je dois réaliser une extraction de données de la base. J'ai donc créé des curseurs avec les requêtes qui m’intéresse et je n'ai plus qu'a copier lignes par lignes les résultats dans un fichier.
Le problème est que la première ligne de se fichier (avant le traitement) doit-être une sorte de "header" récapitulant le fichier et surtout le nombre de ligne renvoyées par chaque requêtes (3 requêtes)

Comme il est impossible (sauf si je me trompe) de pouvoir connaitre le nombre de ligne d'une requête sans la parcourir je ne peux donc pas écrire cette ligne avant d'avoir fait mon traitement.
Je pensais laisser la place qu'il me fallait pour cette ligne qui est formaté puis y revenir pour l'écrire à la fin du traitement via un FSEEK mais bien qu'il n'y est pas d'erreur à la compilation j'ai à l'exécution l'erreur ORA-29284 erreur de lecture du fichier. Le conseil d'Oracle : vérifier que le fichier est ouvert en lecture...
S'il est impossible d'utiliser FSEEK en écriture que puis-je utiliser ?
J'espère que vous pourrez m'aider
A bientot

PS : Je n'aime pas trop l'idée de devoir faire des tampons ou des buffers si on peut éviter (pour des soucis de mémoire).
viktor951 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 19h23   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 442
Points : 10 442
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Mais si, on peut toujours ruser !
Par exemple, si vous ajoutez ceci dans votre SELECT :
Vous aurez le nombre de total de lignes de votre requête, mais à chaque ligne.

Vous pouvez aussi faire un simple count(*) dans une variable avant de parcourir votre curseur. Si la requête est rapide, ce sera transparent au niveau des performances.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 09h37   #3
Futur Membre du Club
 
Inscription : avril 2010
Messages : 54
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 54
Points : 17
Points : 17
Pour le count(*) over() cela m'oblige à commencer par ouvrir mes 3 curseurs et à récupérer la première ligne mais pourquoi pas après tout .
La deuxième solution j'ai pas trop compris je pense que sa doit être ce à quoi je pensais : J'avais commencé par parcourir mes curseurs une première fois avec juste un compteur pour compter les lignes, puis une seconde fois pour le traitement. C'est pas mal non plus mais c'est pas trop les règles de l'art je pense

Sinon au niveau du traitement des fichiers il n'y a rien? impossible de revenir au début du fichier pour écrire une ligne après le traitement? Même si je prévois la place qu'il faut (taille fixe) ?

Merci de tes conseils en tout cas, je pense que le count(*) over() peut être une bonne solution
viktor951 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 10h32   #4
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 442
Points : 10 442
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Pas besoin de parcourir tout votre curseur pour connaître le nombre de lignes.
Imaginons que votre curseur c'est ceci :
Code :
SELECT c1, c2, c3 FROM t1 WHERE c4 = 'b';
Le nombre de lignes s'obtient ainsi :
Code :
SELECT count(*) /* into v$_count */ FROM t1 WHERE c4 = 'b';
En commentaire le code PL/SQL qui associe directement la valeur à une variable qu'il faudra préalablement déclarer.

Mais sinon il y a d'autre méthodes, par exemple on peut concaténer deux fichiers assez simplement, sous Windows :
Code :
copy fic_1.txt+fic2.txt fic3.txt
Au niveau des performances par contre aucune idée, c'est à tester.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 12h46   #5
Futur Membre du Club
 
Inscription : avril 2010
Messages : 54
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 54
Points : 17
Points : 17
Oui je vois,
l'ennui c'est que mes requêtes sont un peu plus compliquée à cause de l'utilisation de group by notamment... du coup le count(*) ne peut pas s'appliquer, cela renvoi des valeurs incohérentes
Je vais essayer également l'autre solution de concaténation des fichiers mais je pense que cela doit être plus long que de parcourir le curseur car sa fait créer des fichiers temp à supprimer après mais bon... pourquoi pas

Je te remercie en tout cas pour ton aide, je noterais résolu en fin de journée après 2-3 essais

Je suis toujours déçu par FSEEK par contre j'étais persuadé que cela fonctionnait en écriture bah non apparemment ^_^

A bientôt, Merki encore
viktor951 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 14h58   #6
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 442
Points : 10 442
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Un autre solution serait d'alimenter un CLOB avec vos lignes, puis d'alimenter après coup le nombre de lignes avec SQL%ROWCOUNT, en concaténant le clob à la suite de ceci, avant de procéder à l'écriture sur disque.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 11h44   #7
Futur Membre du Club
 
Inscription : avril 2010
Messages : 54
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 54
Points : 17
Points : 17
Bonjour,
J'ai regardé le fonctionnement des clob, ça me parait un peu lourd par rapport à ce que je veux faire.
est-ce que
Code :
 DBMS_XSLPROCESSOR.CLOB2FILE(v_file, 'DUMP_DIR', v_name);
écrit dans un fichier à la suite? ou il le remplace?
Cela pourrait être intéressant si cela écrit à la suite mais j'ai des doutes?

Sinon là j'ai fait juste 2 parcours de mes curseurs, au plus simple. Mais c'est pas très esthétique ^^

Merci pour ton aide en tout cas
@+
viktor951 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 14h50   #8
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 442
Points : 10 442
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Je ne sais pas, mais le but c'est de ne faire cette opération qu'une seule fois.
Vous pouvez concaténer votre CLOB avant de l'écrire sur le disque, c'est l'intérêt.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 09h52   #9
Futur Membre du Club
 
Inscription : avril 2010
Messages : 54
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 54
Points : 17
Points : 17
Merci beaucoup pour ton aide
A bientôt
viktor951 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 12h12.


 
 
 
 
Partenaires

Hébergement Web