-
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 :D
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).
-
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.
-
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 :calim2: 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 :aie:
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
-
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.
-
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 :calim2: bah non apparemment ^_^
A bientôt, Merki encore :P
-
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.
-
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
@+ :)
-
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.
-
Merci beaucoup pour ton aide :)
A bientôt