,

J'ai une petite procédure qui permet de générer du contenu XML dans un lob et de créer ensuite un fichier texte avec UTL_FILE ... Le problème est que de temps en temps (je dirais même aléatoirement ... du moins je ne trouve pas de dénominateur commun ...) elle me déclenche une erreur 29285 ...

Code : 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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
PROCEDURE GEN_FICHIER_XML(P_REQUETE IN VARCHAR2, P_CHEMIN IN VARCHAR2, P_FICHIER IN VARCHAR2) IS
 
  LXML_FILE UTL_FILE.FILE_TYPE;
  LLOB_XML CLOB;
  LBOO_CONTINUE BOOLEAN := TRUE;
  LINT_BUFFER INT := 32000; 
  LCTX_CTX DBMS_XMLQUERY.CTXTYPE;
 
BEGIN
 
-- Creation du XML dans un LOB
LCTX_CTX := DBMS_XMLQUERY.NEWCONTEXT(P_REQUETE);
DBMS_XMLQUERY.SETDATEFORMAT(LCTX_CTX, 'dd/MM/yyyy HH:mm:ss');
DBMS_XMLQUERY.SETENCODINGTAG(LCTX_CTX, 'windows-1252');
DBMS_LOB.CREATETEMPORARY(LLOB_XML,True,10);
LLOB_XML := DBMS_XMLQUERY.GETXML(LCTX_CTX);
DBMS_XMLQUERY.CLOSECONTEXT(LCTX_CTX);
-- Creation du fichier XML de reception
LXML_FILE := UTL_FILE.FOPEN(P_CHEMIN, P_FICHIER, 'w', LINT_BUFFER+2);
-- Remplissage du fichier XML de reception par le LOB
WHILE LBOO_CONTINUE LOOP
  IF LENGTH(LLOB_XML) > LINT_BUFFER THEN
    UTL_FILE.PUT(LXML_FILE, SUBSTR(LLOB_XML, 1, LINT_BUFFER));
    UTL_FILE.FFLUSH(LXML_FILE);
    LLOB_XML := SUBSTR(LLOB_XML, LINT_BUFFER + 1);
  ELSE
    UTL_FILE.PUT(LXML_FILE, SUBSTR(LLOB_XML, 1, LENGTH(LLOB_XML)));
    LBOO_CONTINUE := FALSE;
  END IF;
END LOOP;
 
DBMS_LOB.FREETEMPORARY(LLOB_XML);
UTL_FILE.FCLOSE(LXML_FILE);
 
EXCEPTION
  WHEN OTHERS THEN
    LOG_ERREUR('GEN_FICHIER_XML REQUETE=' || P_REQUETE || ' - CHEMIN=' || P_CHEMIN ||
' - FICHIER=' || P_FICHIER, SQLERRM);
END GEN_FICHIER_XML;
  • Le directory existe bien (et toujours).
  • Le principe que j'utilise est donc de découper mon XML par paquet de 32000 caractères, de le flush dans un fichier et ensuite traiter les autres paquets ... jusque la fin du fichier ...


Mais malheuresement cela n'arrive pas à coup sur à bout !

Quelqu'un aurait il une idée ?

Merci d'avance !