IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

FSEEK en écriture


Sujet :

PL/SQL Oracle

  1. #1
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 65
    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).

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    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.

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 65
    Par défaut
    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

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Pas besoin de parcourir tout votre curseur pour connaître le nombre de lignes.
    Imaginons que votre curseur c'est ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select c1, c2, c3 from t1 where c4 = 'b';
    Le nombre de lignes s'obtient ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    copy fic_1.txt+fic2.txt fic3.txt
    Au niveau des performances par contre aucune idée, c'est à tester.

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 65
    Par défaut
    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

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    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.

  7. #7
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 65
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
     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
    @+

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    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.

  9. #9
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 65
    Par défaut
    Merci beaucoup pour ton aide
    A bientôt

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [DOM] création et écriture
    Par phoebe dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 22/03/2004, 15h13
  2. Compréhension de fseek
    Par Argonz dans le forum C
    Réponses: 9
    Dernier message: 12/01/2004, 15h01
  3. [debugger] détection écriture mémoire
    Par tut dans le forum MFC
    Réponses: 3
    Dernier message: 07/01/2004, 10h17
  4. [Kylix] Simplifications de l'écriture Kylix/Pascal"
    Par Mr Vincent KLEIN dans le forum EDI
    Réponses: 1
    Dernier message: 11/03/2003, 11h07
  5. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo