ããããããã«ã¯å€ãã®çç±ããããããããã«ç¬èªã®çç±ããããŸãã ç§ãå«ãäžéšã®äººã¯ãããŒã¿ããŒã¹ã«ããé©çšããžãã¯ã®å®è£ ã«ãã£ãŠãŸã£ãã軜disãããŠããŸããããäžéšã®äººã«ãšã£ãŠã¯å€é¢šãªæ®éªžã®ããã§ãããDBMSã§XMLãæäœããããŒã«ã®æçšæ§ã¯ãã®ãããªäººã ã«ã¯çããããããããŸããã ãã ããã¢ããªã±ãŒã·ã§ã³ã®æäœäžã«ãã®ãããªæ©äŒãåŸãããšã«åœ¹ç«ã€ããšã«ç°è°ãå±ãã人ã¯ã»ãšãã©ããŸããã ããšãã°ãåžå£²æ¥è ã®äŸ¡æ Œè¡šã¢ããªã±ãŒã·ã§ã³ã¯ãç§ãã¡ã«åãå ¥ããããŸããã§ããã圌ã¯ãäžéšã®ããžã·ã§ã³ã®èšé²ã®æ¬ åŠã«æ··chaãšããŠåªãããããŸããã XMLã§2äžä»¥äžã®ããžã·ã§ã³-ç¬ãæ¥è¥²ããå ŽæãèŠã€ããŠãã ãããããã¯ç¹ã«ã¢ããªã±ãŒã·ã§ã³ãæ··ä¹±ãããŸããã åæããŸããXMLã«ãªã¹ãããã補åã®ãªã¹ãããå€æããŒãã«ã«æ¥ç¶ã§ããããŒã¿ã»ãããšããŠè¡šç€ºããŠãäžåºŠã«å€æãããªãã£ããã¹ãŠã®ããžã·ã§ã³ãæããã«ã§ããã®ã¯çŽ æŽãããããšã§ããããã ãããŠãå€ãã®åæ§ã®äŸãæããããšãã§ããŸãã XMLã¡ãã»ãŒãžã®äº€æãéããŠå€éšã·ã¹ãã ãšçµ±åããã¢ããªã±ãŒã·ã§ã³ããµããŒãããæ©äŒããããŸããããã¢ããªã±ãŒã·ã§ã³èªäœã¯OracleãæäŸããããŒã«ã䜿çšããŠããªãã£ãã«ããããããããã®è£œåã®ãµããŒãã§ç§ãååã«ãšã£ãŠéåžžã«åœ¹ç«ã€ããšãããããŸããã
ãã®èšäºã§ã¯ãOracle DatabaseããŒã«ã䜿çšããŠãããŸããŸãªè€éãã®XMLã解æããããšãããã«ç°¡åã§ç°¡åãã瀺ããããšæããŸãã
ããã§DOMããŒãµãŒã«è§ŠããããããŸããã ããã¯DBMS_XMLDOMããã±ãŒãžã«ãã£ãŠå®è£ ãããŠãããšããèšããŸããã å Žåã«ãã£ãŠã¯ãéçºè ã«ãšã£ãŠéåžžã«åœ¹ç«ã€ããšãããã以åã«ä»ã®ã¡ãŒã«ãŒã®DOMããŒãµãŒã«ééããããšããã人ã«ãšã£ãŠã¯ããããæ±ãã®ã¯é£ãããããŸããã
Oracleã®é©æ°çãªæ©èœã¯ãXMLTypeåãšãããæäœããæ段ã§ãã ãã®ã¿ã€ãã¯ãããŒãžã§ã³9.2以éã®Oracle Databaseã«å«ãŸããŠããXML DBãã¯ãããžãŒã®äžéšã§ãã
XMLããã¥ã¡ã³ãã®ãœãŒã¹ããã¹ãã¯ãCLOBãBLOBãVARCHAR2ãBFILEåã®å€ãšããŠXMLTypeã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ãããšãã§ããŸãã ãããããBFILEã䜿çšãããšãã¯ã©ã€ã¢ã³ãã§ã¯ãªããµãŒããŒã®ãã¡ã€ã«ã·ã¹ãã ãããã¡ã€ã«ãããŠã³ããŒãã§ããããšã«æ³šæãã䟡å€ããããŸããXMLãã¯ã©ã€ã¢ã³ãåŽã«ããããªã¯ãšã¹ãã§æååãšããŠéä¿¡ããã®ã«ååãªå€§ããã§ããã°ãããããXMLã§ãã¡ã€ã«ãé ä¿¡ããå¯èœæ§ãèæ ®ããå¿ èŠãããããã§ããµãŒããŒãã¡ã€ã«ã·ã¹ãã ãžã®ã³ã³ãã³ãã
æååã§æž¡ãããã³ã³ãã³ãã§XMLTypeã€ã³ã¹ã¿ã³ã¹ãäœæããäŸïŒ
select XMLType( '<hello-world> <word seq="1">Hello</word> <word seq="2">world</word> </hello-world> ') XML from dual
XMLTypeã®ã€ã³ã¹ã¿ã³ã¹ãäœæããããšã«ãããXMLã解æããæåã®tiç ãªã¹ããããè©Šã¿ãããšãã§ããŸãã XMLTypeåã¯Extractã¡ãœãããå®è£ ããXPatchåŒãååŸãããšããã®åŒã«äžèŽããXMLãã©ã°ã¡ã³ããè¿ããŸãã XMLãã©ã°ã¡ã³ãïŒXMLãã©ã°ã¡ã³ãïŒã¯ãé©åã«æ§ç¯ãããXMLïŒhelloformed XMLïŒãšã¯å¯Ÿç §çã«ãã«ãŒãèŠçŽ ã®äžåšãèš±å¯ããŸãïŒã€ãŸããæ§æã«è€æ°ã®ã«ãŒãèŠçŽ ãèš±å¯ããŸãïŒã
ãããã£ãŠã以äžã®äŸã§ã¯ã3ã€ã®åŒã3ã€ã®XMLãã©ã°ã¡ã³ããè¿ããŸãã æåã¯åèªèŠçŽ ã®ãã¹ãŠã®åºçŸãè¿ãã2çªç®ã¯åèªèŠçŽ ã®æåã®åºçŸã®ã¿ãè¿ãã3çªç®ã¯åèªèŠçŽ ã®ããã¹ãã³ã³ãã³ãã®ãã©ã°ã¡ã³ããè¿ããŸããseqå±æ§ã®å€ã¯2ã§ãã
SQL> with demo1 as ( 2 select XMLType( 3 '<hello-world> 4 <word seq="1">Hello</word> 5 <word seq="2">world</word> 6 </hello-world> 7 ') xml 8 from dual 9 ) 10 select t.xml.extract('//word') case1 11 ,t.xml.extract('//word[position()=1]') case2 12 ,t.xml.extract('//word[@seq=2]/text()') case3 13 from demo1 t; CASE1 CASE2 CASE3 --------------------------- -------------------------- ------- <word seq="1">Hello</word> <word seq="1">Hello</word> world <word seq="2">world</word>
ããã§ã3çªç®ã®ã±ãŒã¹ã§ã¯ããã®èŠçŽ ã®å€ã§ã¯ãªããXMLãã©ã°ã¡ã³ããè¿ããããšããäºå®ã«å€§èã«éç¹ã眮ã䟡å€ããããšæããŸãã ãã®å€ã«ïŒamp;ãïŒgt;ãªã©ã®ãšã¹ã±ãŒãæåãå«ãŸããŠããå Žåã«ã®ã¿ãéããé¡èã«ãªããŸãã èŠçŽ ã®å€ãååŸããã«ã¯ãextractValueé¢æ°ã䜿çšããŸãã ããã§ãäž»ãªXMLTypeã¡ãœãããSQLé¢æ°ã«ãã£ãŠè€è£œãããããšããŸãã¯ãã®éã§ããããšã«èšåããŸããXMLTypeãæäœããäž»ãªæ©èœã¯ããã®ã¡ãœããã®åœ¢åŒã§å®è£ ãããŸãã ãã ããextractValueã¯äŸå€ã§ãã extractValueã¯é¢æ°ãšããŠã®ã¿è¡šç€ºãããŸãã æ®å¿µãªãããXMLTypeã¯extractValueã¡ãœãããå®è£ ããŠããŸããã
SQL> with demo2 as (select xmltype('<a><&hello&></a>') xml from dual) 2 select t.xml.extract('a/text()').getStringVal() case1 3 ,extractValue(t.xml,'a') case2 4 from demo2 t; CASE1 CASE2 --------------------------- -------------------------- <&hello&> <&hello&>
ãããããåå空éãæäœããããã®èŠåã«ã€ããŠãèšåããå¿ èŠããããŸãã ãã¹ãŠã®çŽèŠ³ããããã®åäœã¡ã«ããºã ã®æ£ããç解ã«ã€ãªããããã§ã¯ãããŸããã é¢æ°ïŒããã³ã¡ãœããïŒã®æœåºã§ããextractValueã¯ããã©ã¡ãŒã¿ãŒã®1ã€ãšããŠãåå空éã®èª¬æãåãåããŸãã ãã®ãã©ã¡ãŒã¿ãŒã§èª¬æãããŠããåå空éã¯ãXPathåŒã§äœ¿çšã§ããŸãã ãããŠãããã¯ãŸãã«ç§ã匷調ãããããšã§ãã 3çªç®ã®ã±ãŒã¹ã«æ³šæããŠãã ããã XMLããã³XPatchåŒã®åå空éã«ã¯ãç°ãªããšã€ãªã¢ã¹ããããŸããã解æã¯æåãããããåãURIããããŸãã
SQL> select extractValue(t.xml,'a') case1 2 ,extractValue(t.xml,'a','xmlns="foo"') case2 3 ,extractValue(t.xml,'y:a/@z:val','xmlns:y="foo" xmlns:z="bar"') case3 4 from (select XMLType('<a xmlns="foo" xmlns:x="bar" x:val="a-val">a-text</a>') XMl from dual) t; CASE1 CASE2 CASE3 --------------------------- -------------------------- -------------------------- a-text a-val
ããã§ãå€ãæœåºããããšãåŠãã ã®ã§ãä»åºŠã¯ããããå ±æããããšãåŠã¶ã¹ãã§ãã æåã®äŸã§ã¯ãæåã®äŸã§ã¯ãXMLãããã¹ãŠã®åèªèŠçŽ ãéžæããããšããŸãããã2ã€ã®åèªèŠçŽ ãååŸããŸãããã1ã€ã®ãã©ã°ã¡ã³ãã§ååŸããŸããã è€æ°ã®ã«ãŒãèŠçŽ ãå«ããã©ã°ã¡ã³ãããããããã1ã€ã®ã«ãŒãèŠçŽ ãå«ããã©ã°ã¡ã³ãã®ã·ãŒã±ã³ã¹ãšããŠæ瀺ããããã«ããã€ãã©ã€ã³åãããXMLSeqenceé¢æ°ããããŸãã ãã®é¢æ°ã¯ãXMLTypeå€ã®ããŒãã«ã§ããXMLSequenceTypeãè¿ããŸãã
çªç¶èª°ããå¿ããŠããŸã£ãå Žåããã€ãã©ã€ã³åãããé¢æ°ã¯ã³ã¬ã¯ã·ã§ã³ãè¿ãã®ã§ãåŒã³åºããããšãã«ããŒãã«åŒã§ã©ãããããããšãæãåºããŠãã ããã ãããã®é¢æ°ã®çµæã¯ãä»®æ³åcolumn_valueãŸãã¯åŒã®å€ïŒïŒã䜿çšããŠã¢ã¯ã»ã¹ããããããããŒãã«åŒã®ãšã€ãªã¢ã¹ãå®çŸ©ããå¿ èŠããããŸãïŒããŒãã«ã³ã¬ã¯ã·ã§ã³ã®é€å€ïŒã çªç¶èª°ãããããç¥ããªãã£ãå Žåãç§ã¯ãã³ãã©ãšããŠãããæèšããããšããå§ãããŸããç解ã¯æéãšãšãã«ããããŠå¿ èŠãªå Žåã«ã®ã¿æ¥ãã§ãããã
XMLSequenceã®æãç°¡åãªäœ¿çšäŸïŒ
SQL> select extractValue(value(t),'b') result 2 from table(XMLSequence(XMLType('<a><b>b1</b><b>b2</b></a>').extract('a/b'))) t; RESULT ------------------------------------------------------------------------------------- b1 b2
ããã§äœãèµ·ãã£ãŠããã®ããèšãããšæããŸããããã·ã¢èªã§ã¯ãSQLã®å Žåãããã¯ããã«ä¹±éã«ãªããã¯ã£ããããªãããšãããããŸãã fromã¹ããŒãã¡ã³ãã§ã¯ããŸãXMLTypeã®ã€ã³ã¹ã¿ã³ã¹ãäœæããXMLããã¹ããå«ãæååãæž¡ããŸãã 次ã«ãextractã¡ãœããã䜿çšããŠãèŠçŽ aãå«ããã¹ãŠã®bèŠçŽ ã1ã€ã®ãã©ã°ã¡ã³ãã«æœåºããŸãã çµæã®XMLãã©ã°ã¡ã³ãã¯ããã©ã¡ãŒã¿ãšããŠXMLSequenceãã€ãã©ã€ã³é¢æ°ã«æž¡ãããŸããXMLSequenceãã€ãã©ã€ã³é¢æ°ã§ã¯ãææ³ã®èŠåã«åŸã£ãŠãtableå¥ã䜿çšãããŸãã ãã®æã§èšè¿°ãããã¬ã³ãŒãã»ããã«ã¯ããšã€ãªã¢ã¹tãå²ãåœãŠãããŸãã select-list'eã§ã¯ãããŒãã«åŒtã«ãã£ãŠè¿ããããªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ãååŸããŸããããã¯XMLTypeåãæã£ãŠããŸãã ããŒãã«åŒã«ãã£ãŠè¿ãããåè¡ã«å¯ŸããŠããã®ã€ã³ã¹ã¿ã³ã¹ã«ã¯ãœãŒã¹XMLã®èŠçŽ bã®1ã€ã®ãã©ã°ã¡ã³ããå«ãŸããŸãã ãã®ãªããžã§ã¯ãããã©ã¡ãŒã¿ãŒãšããŠextractValueé¢æ°ã«æž¡ããŸãã çµæã¯é¡ã«ãããŸãã
å®éããã¹ãŠãç§ã®ãã¬ãŒã³ããŒã·ã§ã³ã§å€æããã»ã©è€éã«ãªãããšã«ã¯ã»ã©é ãã å°ãæ £ããã°ååã§ã ããããè³ã®èåŸ ã¯ãŸã å®å šã«ã¯å®äºããŠããŸããã ãã®æ®µéã§æã£ãŠãããã®ã¯ã1ã€ã®XMLããã¥ã¡ã³ãã«å¯ŸããŠã®ã¿æ©èœããŸãã ã©ãã«ã«è€æ°ã®XMLã®ãœãŒã¹ããã¹ããããããããã®ããã€ããäžåºŠã«è§£æããå¿ èŠãããå Žåãæ®ã£ãŠããçžé¢é¢ä¿ãèŠããŠããå¿ èŠããããŸãã ããã«ãè»éã¯ãããŸããã ãã®ããšã¯ãããŒãã«åŒïŒããŒãã«ã³ã¬ã¯ã·ã§ã³åŒïŒå°çšã«Oracleã«ãã£ãŠçºæãããŸããã äžçªäžã®è¡ã¯ãããŒãã«åŒã§ã¯ãããŒãã«åŒèªäœã®åïŒå·ŠïŒã®fromã¹ããŒãã¡ã³ãã§å®çŸ©ãããããŒã¿ã»ããã®å€ïŒåïŒã䜿çšã§ããããšã§ãã å®éã«ã¯ãããã¯è³ã»ã©ã²ã©ããã®ã§ã¯ãããŸããã
SQL> with demo3 as(select 1 id, XMLType('<a><b>b1</b><b>b2</b></a>') xml from dual 2 union all select 2 id, XMLType('<a><b>b3</b><b>b4</b></a>') xml from dual) 3 select id xml_id 4 ,extractValue(value(t),'b') result 5 from demo3 s,table(XMLSequence(s.xml.extract('a/b'))) t; XML_ID RESULT ---------- -------------------------------------------------- 1 b1 1 b2 2 b3 2 b4
ããã§ãããŒãã«åŒtã§ã¯ãdemo3ããŒãã«ã®xmlå€ã䜿çšãããŸãã åŒã¯ãdemo3ããŒãã«ã®åè¡ã«å¯ŸããŠèšç®ãããŸãã ããã¯ããã®ãããªå€§ãããªèšè-å·Šçžé¢ãšåŒã°ãããã®ã§ãã
説æãããŠããæ©èœã¯ãã»ãšãã©ãã¹ãŠã®è€éãã®XMLã解æããã®ã«ååã§ãã ãããããæããã«æªç¥ã®ãã¹ãã®æ·±ãã®éå±€çã«æ瀺ãããããŒã¿ã®ã¿ãããããã®æ段ã§åæããããšã¯ã§ããŸããã ãã®ãããªæ§é ã解æããã«ã¯ãXSLTã«é Œã£ãŠXMLãããèªã¿ãããããå¿ èŠããããŸãã XSLTå€æã¯ããœãŒã¹ããã¥ã¡ã³ãã®XMLTypeãæåã®ãã©ã¡ãŒã¿ãŒãšããŠ2çªç®ã®XMLType XSLãã³ãã¬ãŒããååŸããå€æçµæã®XMLTypeãè¿ãXMLTransformé¢æ°ã«ãã£ãŠå®è¡ãããŸãã
ååãšããŠãããã¯çè«ã§è¡ãããšãã§ããŸãã çµè«ãšããŠãããŸããŸãªã¬ãã«ã®XMLãã¹ãããèŠçŽ ãæœåºããäŸã瀺ããŸãã åå¿è ã«ãšã£ãŠãããã¯æã å°é£ãåŒãèµ·ãããŸãã
SQL> with demo4 as( 2 select XMLType( 3 '<master> 4 <id>mater id</id> 5 <details> 6 <detail> 7 <id>detail 1 id</id> 8 <sub_details> 9 <sub_detail> 10 <id>sub_detail 1.1 id</id> 11 </sub_detail> 12 <sub_detail> 13 <id>sub_detail 1.2 id</id> 14 </sub_detail> 15 </sub_details> 16 </detail> 17 <detail> 18 <id>detail 2 id</id> 19 <sub_details> 20 <sub_detail> 21 <id>sub_detail 2.1 id</id> 22 </sub_detail> 23 <sub_detail> 24 <id>sub_detail 2.2 id</id> 25 </sub_detail> 26 </sub_details> 27 </detail> 28 <detail> 29 <id>detail 3 id</id> 30 </detail> 31 </details> 32 </master>' 33 ) xml from dual) 34 select extractValue(s.xml,'master/id') master_id 35 ,extractValue(value(dtl),'detail/id') detail_id 36 ,extractValue(value(subdtl),'sub_detail/id') sub_detail_id 37 from demo4 s 38 ,table(XMLSequence(s.xml.extract('master/details/detail'))) dtl 39 ,table(XMLSequence(value(dtl).extract('detail/sub_details/sub_detail')))(+) subdtl; MASTER_ID DETAIL_ID SUB_DETAIL_ID --------------------------- -------------------------- -------------------------- mater id detail 1 id sub_detail 1.1 id mater id detail 1 id sub_detail 1.2 id mater id detail 2 id sub_detail 2.1 id mater id detail 2 id sub_detail 2.2 id mater id detail 3 id
ã芧ã®ãšãããæ°ãããã®ã¯äœããããŸããã ãã¹ãŠåãå·Šçžé¢ã 泚æãããã®ã¯ãããŒãã«åŒsubdtlã®æåŸã«ããïŒ+ïŒã ãã§ãã ããããæšæž¬ããã®ãé£ãããªãããã«ãå€éšæ¥ç¶ã䜿çšããå¿ èŠãããããšãæå³ããŸãã æå®ããªãã£ãå Žåã詳现3ã®æååã¯ååŸãããŸããã
ããã§ã¯ãç®ã®åã«äœãçŸããã®ã§ããããïŒ ãªããžã§ã¯ãã®çš®é¡ã¯1ã€ã§ãæ¯èŒçéãããæ©èœã»ããã§ãããå®è³ªçã«ç¡å¶éã®æ©èœã»ãããæäŸããŸãã ç§ã¯ãã®å®è£ ãæ¬åœã«å¥œãã§ãã ç§ãæãé©ããã®ã¯ãOracle corpãXMLã«åãããŠSQLã®ã»ãã³ãã£ã¯ã¹ã調æŽããå¿ èŠããªãã£ãããšã§ãã 説æãããŠãããã¹ãŠã®æ©èœïŒãªããžã§ã¯ãããã€ãã©ã€ã³é¢æ°ãããŒãã«åŒïŒã¯ããã®ãã¯ãããžã§äœ¿çšãããŸãããç¹å¥ã«äœæããããã®ã§ã¯ãããŸããã 誰ã§ããã®ãããªå®è£ ãå®è£ ã§ããããšãããããŸããã ãã®å€§èãªå®è£ ã¯ãOracleã®SQLãšã³ãžã³ã®èœåãšæè»æ§ã匷調ããŠããŸãã
ãããããã®ã¡ã¢ã§ã¯ãç§ãäºæ³ããŠããåé¡ã¯ãç§ã«å¹³åãäžããã®ã§ã¯ãªããéé£ããããšã§çµãã£ããããããŸããã ãç·ãããªãã¯äœäžçŽã«äœãã§ããŸããïŒããªãã¯é·ãéã«ã¬ã³ããŒãèŠãŸãããïŒ 2011幎ã¯å¹Žã®çµããã«è¿ã¥ããŠãããæåã®çç£ãããŒã¿ããŒã¹ã®11r2ããŒãžã§ã³ã«åŒãäžããããã®ã§ã¯ãªããçããã¯9çªç®ã®æ©èœãåãã§ããŸãã ã¯ããç§ã®åŸãã«ãã®ãããªçœªäººãããŸãã ç§ã¯ã第10ããŒãžã§ã³ã§ãã°ãããXMLTableãå°å ¥ããããšãããç¥ã£ãŠããŸããããã¯ãä»èª¬æããæ©èœãå®å šã«ããã¯ã°ã©ãŠã³ãã«å ¥ããŠããŸãã ããã«ãããXMLã®è§£æãããã«ç°¡åã«ãªããããè€éã«ãªããŸããã ãã ããXMLTableã䜿çšããå Žåãæ¢ã«æãããªããšãè¶ ããŠäœããèšãã«ã¯ååãªçµéšããããŸããã ãããã£ãŠãç§ã¯èªåèªèº«ãåçŽãªãã¢ã³ã¹ãã¬ãŒã·ã§ã³ã«å¶éããŸãã
åãäŸã瀺ããŸãã
34 select master_id 35 ,details_id 36 ,sub_details_id 37 from demo4 s 38 ,XMLTable('master' 39 passing (s.xml) 40 columns master_id varchar2 (20) path 'id' 41 ,details XMLType path 'details/detail') mstr 42 ,XMLTable('detail' 43 passing (mstr.details) 44 columns details_id varchar2 (20) path 'id' 45 ,sub_details XMLType path 'sub_details/sub_detail')(+) dtl 46 ,XMLTable('sub_detail' 47 passing (dtl.sub_details) 48 columns sub_details_id varchar2 (20) path 'id')(+) sub_dtl; MASTER_ID DETAILS_ID SUB_DETAILS_ID --------------------------- -------------------- -------------------- mater id detail 1 id sub_detail 1.1 id mater id detail 1 id sub_detail 1.2 id mater id detail 2 id sub_detail 2.1 id mater id detail 2 id sub_detail 2.2 id mater id detail 3 id
ãã£ãšããããã®æçŽãããããã«æããŸããå ¬æ£ãªçåãçãããããããŸãã...ããããã€ãããŒã·ã§ã³ã®å©çã¯äœã§ããïŒ å©ç¹ã¯ãXMLTableã®æåã®ãã©ã¡ãŒã¿ãŒãXPathåŒã§ã¯ãªããXQueryã«ãªã£ãããšã§ãã ãããã£ãŠãçµåã¯SQLã®æ段ã§ã¯ãªãããã®æ段ã«ãã£ãŠæ£ç¢ºã«å®è¡ã§ããŸãã XMLTableã¯ãŸã ãããããšçŽæããŸãããæ®å¿µãªããç¹°ãè¿ããŸãããããã«ã€ããŠã¯äœãèªããŸããã