Le fichier UTL_FILE reste ouvert par Oracle
Salut,
J'ai un problème assez étrange... j'ai un script d'extraction basé sur un bloc PL/SQL qui écrit dans un fichier avec UTL_FILE. Ensuite, le fichier est envoyé à une autre machine par un script ksh. Avant d'envoyer le fichier, le script vérifie qu'il n'est pas ouvert par un autre process, en utilisant fuser. Or, apparemment il reste ouvert par Oracle, malgré le UTL_FILE.FCLOSE :
Citation:
[test@octopus] fuser /temp/monfichier.dat
/temp/monfichier.dat: 20925o 20917o 20909o 20903o 20899o
[test@octopus] ps -ef | egrep "(20925|20917|20909|20903|20899)"
oracle 18195 1 0 15:18:03 ? 0:01 ora_p000_MABASE
oracle 18203 1 0 15:18:03 ? 0:01 ora_p004_MABASE
oracle 18199 1 0 15:18:03 ? 0:01 ora_p002_MABASE
test 19208 5462 0 15:19:41 pts/39 0:00 egrep (18203|18201|18199|18197|18195)
oracle 18197 1 0 15:18:03 ? 0:01 ora_p001_MABASE
oracle 18201 1 0 15:18:03 ? 0:00 ora_p003_MABASE
D'après ce que j'ai vu sur Google, les processes ora_pxxx_MABASE sont liés au parallélisme (et ma requête d'extraction utilise effectivement un hint PARALLEL). Au bout de quelques instants (~2mn) ces processes s'arrêtent et le fichier est libéré. Mais je ne comprends pas pourquoi le fichier n'est pas fermé immédiatement quand je fais FCLOSE...
A titre indicatif, voilà le "squelette" du bloc PL/SQL (je n'ai pas le droit de mettre le code complet) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
DECLARE
CURSOR mon_curseur IS
SELECT /*+ PARALLEL(CSC, 4) ... */
...;
BEGIN
BEGIN
-- Open extraction file
V_FILE := UTL_FILE.FOPEN(V_FILE_DIR,V_FILE_NAME,'W');
EXCEPTION
...
END;
FOR rec IN mon_curseur
LOOP
BEGIN
UTL_FILE.PUT_LINE(V_FILE, ...);
EXCEPTION
...
END;
END LOOP;
UTL_FILE.FCLOSE(V_FILE);
END; |
Connaissez-vous un moyen de régler ce problème ? Ne pas utiliser le parallélisme n'est pas acceptable en terme de performances...