Bonjour,
Je rencontre quelques soucis, pour convertir une table en XML
Cet exemple fonctionne ci-dessous, mais je ne suis pas pleinement satisfait, car si la valeur n'est pas définie pour la balise celle-ci est quand même affichée.Code:
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 SELECT XMLSERIALIZE(document XMLElement("Request", xmlelement("Element", xmlelement("TimeStamp",NULL), xmlelement("TaxesTimeStamp",NULL), xmlelement("CmpCode",NULL), xmlelement("Level",NULL), xmlelement("Code",NULL), xmlelement("Name",NULL), xmlelement("ShortName",NULL), xmlelement("Matchable",NULL), xmlelement("CustomerSupplier",NULL), xmlelement("SubAnalyse",NULL), xmlelement("AccountType",NULL), xmlelement("CurrencyCode",NULL), xmlelement("StartPeriod",NULL), xmlelement("EndPeriod",NULL), xmlelement("CompulsoryDescr",NULL), xmlelement("KeepTurnover",NULL), xmlelement("PayStatus",NULL), xmlelement("EnablePay",NULL), xmlelement("Summary",NULL), xmlelement("Split",NULL), xmlelement("Settlement",NULL), xmlelement("ForceDisperse",NULL), xmlelement("PaperMedia",NULL), xmlelement("ElecMedia",NULL), xmlelement("DefaultMedia",NULL), xmlelement("Terms",NULL), xmlelement("TaxAdjustment",NULL), xmlelement("DiscountEnable",NULL), xmlelement("TaxMethod",NULL), xmlelement("DateAccountOpened",NULL), xmlelement("ElementStatus",NULL), xmlelement("AccountSummary",NULL), xmlelement("MemoStatus",NULL), xmlelement("VAT",NULL), xmlelement("TaxRepESL",NULL), xmlelement("EUVATCode",NULL), xmlelement("ReportingCode1",NULL), xmlelement("ReportingCode2",NULL), xmlelement("ReportingCode3",NULL), xmlelement("SIC",NULL), xmlelement("IndirectCode",NULL), xmlelement("Ten99",NULL), xmlelement("Ten99Code",NULL), xmlelement("FederalTax",NULL), xmlelement("SocialSecurity",NULL), xmlelement("SecondTIN",NULL), xmlelement("User",NULL), xmlelement("Addresses",(SELECT xmlagg( xmlelement("Address", xmlelement("Tag", ADDR.tag), xmlelement("Name", ADDR.name) ) ) FROM OAS_ELMADDRLIST ADDR WHERE ADDR.CMPCODE = ELM.CMPCODE AND ADDR.ELMCODE = ELM.CODE AND ADDR.ELMLEVEL = ELM.ELMLEVEL) ) ) ) AS CLOB INDENT SIZE = 6) AS deptxml FROM OAS_ELEMENT ELM WHERE CODE LIKE 'F0%' AND ELMLEVEL = 2
L'autre solution est d'utiliser cette solution (avec des types) :
Ce qui donne :Code:
1
2
3
4
5
6
7
8
9 CREATE OR REPLACE TYPE xml_element AS OBJECT ( .... ); CREATE OR REPLACE TYPE xml_address AS OBJECT ( "Tag" VARCHAR2(300), "Name" VARCHAR2(300) );
Losqu'il constitue la balise de la partie xml_address, il la nomme "xml_address" ce qui ne me convient pas puisqu'elle devrait se nommer "Address" (comme le 1er exemple plus haut) :Code:
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 SELECT XMLSERIALIZE(document XMLElement("Request", xml_element( 0, -- TimeStamp 0, -- TaxesTimeStamp ELM.CMPCODE, -- CmpCode ELM.ELMLEVEL, -- Level ELM.CODE, -- Code ELM.NAME, -- Name ELM.SNAME, -- ShortName NULL, -- Matchable NULL, -- CustomerSupplier NULL, -- SubAnalyse NULL, -- AccountType ELM.CUR, -- CurrencyCode NULL, -- StartPeriod NULL, -- EndPeriod NULL, -- CompulsoryDescr NULL, -- KeepTurnover NULL, -- PayStatus NULL, -- EnablePay NULL, -- Summary NULL, -- Split NULL, -- Settlement NULL, -- ForceDisperse NULL, -- PaperMedia NULL, -- ElecMedia NULL, -- DefaultMedia NULL, -- Terms NULL, -- TaxAdjustment NULL, -- DiscountEnable NULL, -- TaxMethod NULL, -- DateAccountOpened NULL, -- ElementStatus NULL, -- AccountSummary NULL, -- MemoStatus NULL, -- VAT NULL, -- TaxRepESL NULL, -- EUVATCode NULL, -- ReportingCode1 NULL, -- ReportingCode2 NULL, -- ReportingCode3 NULL, -- SIC NULL, -- IndirectCode NULL, -- Ten99 NULL, -- Ten99Code NULL, -- FederalTax NULL, -- SocialSecurity NULL, -- SecondTIN 'INFORMATIQUE', -- User (SELECT xmlagg( XMLTYPE((xml_address(0,0))) ) FROM OAS_ELMADDRLIST ADDR WHERE ADDR.CMPCODE = ELM.CMPCODE AND ADDR.ELMCODE = ELM.CODE AND ADDR.ELMLEVEL = ELM.ELMLEVEL ), -- Addresses NULL, -- Banks NULL, -- Groups NULL, -- Medias NULL -- Comments ) AS "Element" ) AS CLOB INDENT SIZE = 6) AS deptxml FROM OAS_ELEMENT ELM WHERE CODE LIKE 'F0%' AND ELMLEVEL = 2
Donc je fais comme pour le xml_element (AS "Element"), j'ajoute donc un AS "Address" :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 ... <Addresses> <XML_ADDRESS> <Tag>0</Tag> <Name>0</Name> </XML_ADDRESS> <XML_ADDRESS> <Tag>0</Tag> <Name>0</Name> </XML_ADDRESS> </Addresses> ...
et la dans ce cas, ça ne fonctionne pas, il me dit qu'il y a un problème de parenthèse droite manquante, juste en ajoutant AS "Address", voici la requête avec la modificationCode:XMLTYPE((xml_address(0,0) AS "Address"))
Code:
1
2
3
4
5 ORA-00907: parenthèse de droite absente 00907. 00000 - "missing right parenthesis" *Cause: *Action: Erreur à la ligne 59, colonne 82
Y a t-il une solution pour nommer ma balise "Address" ?Code:
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 SELECT XMLSERIALIZE(document XMLElement("Request", xml_element( 0, -- TimeStamp 0, -- TaxesTimeStamp ELM.CMPCODE, -- CmpCode ELM.ELMLEVEL, -- Level ELM.CODE, -- Code ELM.NAME, -- Name ELM.SNAME, -- ShortName NULL, -- Matchable NULL, -- CustomerSupplier NULL, -- SubAnalyse NULL, -- AccountType ELM.CUR, -- CurrencyCode NULL, -- StartPeriod NULL, -- EndPeriod NULL, -- CompulsoryDescr NULL, -- KeepTurnover NULL, -- PayStatus NULL, -- EnablePay NULL, -- Summary NULL, -- Split NULL, -- Settlement NULL, -- ForceDisperse NULL, -- PaperMedia NULL, -- ElecMedia NULL, -- DefaultMedia NULL, -- Terms NULL, -- TaxAdjustment NULL, -- DiscountEnable NULL, -- TaxMethod NULL, -- DateAccountOpened NULL, -- ElementStatus NULL, -- AccountSummary NULL, -- MemoStatus NULL, -- VAT NULL, -- TaxRepESL NULL, -- EUVATCode NULL, -- ReportingCode1 NULL, -- ReportingCode2 NULL, -- ReportingCode3 NULL, -- SIC NULL, -- IndirectCode NULL, -- Ten99 NULL, -- Ten99Code NULL, -- FederalTax NULL, -- SocialSecurity NULL, -- SecondTIN 'INFORMATIQUE', -- User (SELECT xmlagg( XMLTYPE((xml_address(0,0) AS "Address")) ) FROM OAS_ELMADDRLIST ADDR WHERE ADDR.CMPCODE = ELM.CMPCODE AND ADDR.ELMCODE = ELM.CODE AND ADDR.ELMLEVEL = ELM.ELMLEVEL ), -- Addresses NULL, -- Banks NULL, -- Groups NULL, -- Medias NULL -- Comments ) AS "Element" ) AS CLOB INDENT SIZE = 6) AS deptxml FROM OAS_ELEMENT ELM WHERE CODE LIKE 'F0%' AND ELMLEVEL = 2
Je viens de trouver ça comme idée mais un peu bricoleur :p meilleure idée ?
OUCode:XMLTYPE(replace (XMLTYPE(xml_address(0,0)).getClobVal(), 'XML_ADDRESS', 'Address'))
OUCode:XMLTYPE( REGEXP_REPLACE(XMLTYPE(xml_address(0,0)).getClobVal(), '^<[^>]+>(.+)<\/[^>]+>$', '<Address>\1</Address>'))
Merci par avanceCode:xmltype('<Address>'||REGEXP_REPLACE(XMLTYPE(xml_address(0,0)).getClobVal(), '^<[^>]+>(.+)<\/[^>]+>$', '\1')||'</Address>')