Bonjour

Je rencontre un problème avec l'utilisation de DBMS_XMLGEN pour générer un XML au sein d'une procédure.
Le problème est le suivant : pour générer la valeur du noeud d'ID "info_r_v" (cf code ci-dessous), j'appelle une fonction stockée "GET_INFO_R_V()", qui génère une chaine de caractère pouvent être (très) longue. Pour cette raison, le type retournée par la fonction est un CLOB. La fonction a été testée et fonctionne correctement.

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
CREATE OR REPLACE PROCEDURE GENERER_XML(A IN NUMBER, B IN varchar2, C IN CHAR, D IN varchar2)AS

  qryCtx DBMS_XMLGEN.ctxHandle;
  resultat CLOB := EMPTY_CLOB();
  read_amount    integer;
  read_offset    integer;
  fini           integer;
  fileXML         utl_file.file_type;
  contenuXML     VARCHAR2(32760);
  position       integer;
  
BEGIN  

  qryCtx := DBMS_XMLGEN.newContext
    ('SELECT distinct XMLAgg(
	    XMLElement("ElementRoot",		
			XMLElement("attribute",
				XMLAttributes(''cat'' AS "id"),
				XMLElement("value",
					art.description
				)
			),
			XMLElement("attribute",
				XMLAttributes(''info_r_v'' AS "id"),
				XMLElement("value",
					XMLCDATA(GET_INFO_R_V(art.id_article, '''||C||'''))
				)
			)
		)
	 ) AS "items"
	FROM Articles art');
  DBMS_XMLGEN.setRowSetTag(qryCtx, null);
  DBMS_XMLGEN.setRowTag(qryCtx, null);
  -- récupération du XML résultant dans un CLOB
  resultat := DBMS_XMLGEN.getXML(qryCtx);
  
  -- Puis écriture de ce CLOB dans un fichier (OK)
  
END;

Mais lors de l'exécution de la procédure, j'obtiens l'erreur :
ORA-19202: Une erreur s'est produite lors du traitement la fonction XML (
ORA-22835: Taille de tampon insuffisante pour la conversion de CLOB en CHAR ou de BLOB en RAW (réelle : 5735, maximum : 4000)
)
ORA-06512: à "SYS.DBMS_XMLGEN", ligne 7
ORA-06512: à "SYS.DBMS_XMLGEN", ligne 147
ORA-06512: à "FAS6.GENERATE_XML_ARTICLES", ligne 418
ORA-06512: à ligne 12

En fait, il semblerait que l'appel à DBMS_XMLGEN.getXML() traite chaque ligne du XML comme un (var)char avant de l'ajouter au CLOB. Mais un (var)char étant limité à 4000 caractères, si la fonction GET_INFO_R_V() en renvoie plus, une exception est levée.
Si je limite la taille de la chaine retour de GET_INFO_R_V() à 4000 caractères à l'aide de DBMS_LOB.SUBSTR(), là tout fonctionne correctement...

Comment faire pour pouvoir générer une ligne longue de plus de 4000 caractères dans un XML?

Merci d'avance!