Bonjour,
j 'ai un soucis d'intégration d'un fichier XML.
celui-ci est composé comme ceci :

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
 
<?xml version="1.0" encoding="ISO-8859-1"?>
<OPs>
	<OP>
		<OrdrePreparation>POC120087324</OrdrePreparation>
			<Ligne>
			<CodeArticle>65456</CodeArticle>
			<Quantite>1</Quantite>
			</Ligne>
			<Ligne>
			<CodeArticle>65585</CodeArticle>
			<Quantite>1</Quantite>
			</Ligne>
	</OP>
	<OP>
		<OrdrePreparation>POC120087321</OrdrePreparation>
			<Ligne>
			<CodeArticle>65318</CodeArticle>
			<Quantite>1</Quantite>
			</Ligne>
			<Ligne>
			<CodeArticle>65458</CodeArticle>
			<Quantite>1</Quantite>
			</Ligne>
	</OP>
</OPs>
on peut donc remarquer trois niveaux:
OPs niveau root
OP entete
Ligne détail


mon but est d'intégrer le fichier dans ma table MATABLE comme cela :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
resultat attendu :
ordrepreparation		codearticle			quantite
POC120087324			65456				1
POC120087324			65585				1
POC120087321			65318				1
POC120087321			65458				1
Evidemment je n'obtiens pas ça
mes entetes et lignes font un produit carthésien qui donne ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
resultat obtenu :
ordrepreparation		codearticle			quantite
POC120087324			65456				1
POC120087324			65585				1
POC120087324			65318				1
POC120087324			65458				1
POC120087321			65456				1
POC120087321			65585				1
POC120087321			65318				1
POC120087321			65458				1
voici ma procedure stockée :
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
 
procedure integ()
  l_bfile   BFILE;
  l_clob    CLOB;
  l_parser  dbms_xmlparser.Parser;
  l_doc     dbms_xmldom.DOMDocument;
  l_nl      dbms_xmldom.DOMNodeList;
  l_nl2      dbms_xmldom.DOMNodeList;
  l_n2       dbms_xmldom.DOMNode;
  l_n       dbms_xmldom.DOMNode;
 
src_csid       NUMBER := NLS_CHARSET_ID('UTF8');  
dest_offset    INTEGER := 1;
src_offset     INTEGER := 1;
lang_context   INTEGER := dbms_lob.default_lang_ctx;
warning        INTEGER;
 
Ordre_Preparation		Varchar2(50);
Code_Article		Number;
Qte			Number;
 
 
BEGIN
 
  l_bfile := BFileName(PATH,FIC_XML);
 
  dbms_session.set_nls('NLS_DATE_FORMAT','''DD-MON-YYYY''');  
 
    dbms_lob.createtemporary(l_clob, cache=>FALSE);
 
  dbms_lob.open(l_bfile, dbms_lob.lob_readonly);
  dbms_lob.loadclobfromFile(  l_clob,
                          l_bfile,
                         dbms_lob.getLength(l_bfile),
                        dest_offset,
                        src_offset, 
                        src_csid, 
                        lang_context,
                        warning);
   dbms_lob.close(l_bfile);
 
  l_parser := dbms_xmlparser.newParser;
  dbms_xmlparser.parseClob(l_parser, l_clob);
  l_doc := dbms_xmlparser.getDocument(l_parser);  
 
  dbms_lob.freetemporary(l_clob);
  dbms_xmlparser.freeParser(l_parser);
 
l_nl := dbms_xslprocessor.selectNodes(dbms_xmldom.makeNode(l_doc),'/OPs/OP');
-- Boucle entete
  FOR cur_stage_xml IN 0 .. dbms_xmldom.getLength(l_nl)-1  LOOP
    l_n := dbms_xmldom.item(l_nl, cur_stage_xml);
 
			dbms_xslprocessor.valueOf(l_n,'OrdrePreparation/text()',Ordre_Preparation);
 
				l_nl2 := dbms_xslprocessor.selectNodes(dbms_xmldom.makeNode(l_doc),'/OPs/OP/Ligne');
 
                                                 -- Boucle détail
				              FOR cur_stage_xml2 IN 0 .. dbms_xmldom.getLength(l_nl2) LOOP  
                				l_n2 := dbms_xmldom.item(l_nl2, cur_stage_xml2);
 
                				dbms_xslprocessor.valueOf(l_n2,'CodeArticle/text()',Code_Article);
                				dbms_xslprocessor.valueOf(l_n2,'Quantite/text()',Qte);
 
                                                INSERT INTO MATABLE (OrdrePreparation,CodeArticle,Quantite)
                    	                      VALUES(Ordre_Preparation,Code_Article,Qte);
 
                                                  END LOOP;
  END LOOP; 
 
COMMIT; 
dbms_xmldom.freeDocument(l_doc);
END;
je suis preneur de tout commentaire ou de toute solution alternative.

merci de vos reponses

vincent