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.
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!
Partager