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 :
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...[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
A titre indicatif, voilà le "squelette" du bloc PL/SQL (je n'ai pas le droit de mettre le code complet) :
Code PLSQL : Sélectionner tout - Visualiser dans une fenêtre à part
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...
Partager