Sql 使用多个命名空间从oracle中的CLOB数据字段导出xml值

Sql 使用多个命名空间从oracle中的CLOB数据字段导出xml值,sql,xml,oracle,Sql,Xml,Oracle,我有一个包含x个记录的表。其中一个字段是CLOB,包含带有特定字段的XML 这是一个非常简短的XML版本 <metadata xml:lang="en" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gco="http://www.isotc211.org

我有一个包含x个记录的表。其中一个字段是CLOB,包含带有特定字段的XML 这是一个非常简短的XML版本

 <metadata xml:lang="en"
 xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:srv="http://www.isotc211.org/2005/srv" xmlns:gts="http://www.isotc211.org/2005/gts" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
  <gmd:GEMINI_Metadata>
        <gmd:fileIdentifier>
            <gco:CharacterString>cf40a39a-0721-4fd4-84f3-adc28aee1158</gco:CharacterString>
        </gmd:fileIdentifier>
    <gmd:dateStamp>
        <gco:Date>2019-01-16</gco:Date>
    </gmd:dateStamp>
  </gmd:GEMINI_Metadata>
</metadata>
我得到以下信息

select EXTRACT (XMLType (DOCUMENTATION), '//fileIdentifier//gco:CharacterString','xmlns:gmd="http://www.isotc211.org/2005/gmd"', 'xmlns:gco="http://www.isotc211.org/2005/gco"') as DOCUMENTATION from sde.gdb_items_vw where name = 'testTable'
ORA-00939: too many arguments for function
DOCUMENTATION
--------------------------------------------------------------------------------
<gmd:fileIdentifier xmlns:gmd="http://www.isotc211.org/2005/gmd"><gco:CharacterS
如果我尝试只指定一个标记和一个名称空间,就像这样

select EXTRACT (XMLType (DOCUMENTATION), '//gmd:fileIdentifier','xmlns:gmd="http://www.isotc211.org/2005/gmd"') as DOCUMENTATION from sde.gdb_items_vw where name = 'testTable';
我得到以下信息

select EXTRACT (XMLType (DOCUMENTATION), '//fileIdentifier//gco:CharacterString','xmlns:gmd="http://www.isotc211.org/2005/gmd"', 'xmlns:gco="http://www.isotc211.org/2005/gco"') as DOCUMENTATION from sde.gdb_items_vw where name = 'testTable'
ORA-00939: too many arguments for function
DOCUMENTATION
--------------------------------------------------------------------------------
<gmd:fileIdentifier xmlns:gmd="http://www.isotc211.org/2005/gmd"><gco:CharacterS

那么,获取在其树中具有多个名称空间的特定标记的正确方法是什么呢?

最好的方法是使用XMLTABLE。在这里,您可以轻松地指定名称空间

SELECT doc AS documentation
  FROM sde.gdb_items_vw,
       XMLTABLE( xmlnamespaces( 'http://www.isotc211.org/2005/gmd' AS "gmd",
                                'http://www.w3.org/2001/XMLSchema-instance' AS "xsi",
                                'http://www.isotc211.org/2005/gco' AS "gco",
                                'http://www.isotc211.org/2005/srv' AS "srv",
                                'http://www.isotc211.org/2005/gts' AS "gts",
                                'http://www.opengis.net/gml' AS "gml",
                                'http://www.w3.org/1999/xlink' AS "xlink",
                                'urn:schemas-microsoft-com:xslt' AS "msxsl"                                
       ), 
       '/metadata' PASSING XMLTYPE(documentation)
       COLUMNS doc VARCHAR2(1000) PATH 'gmd:fileIdentifier/gco:CharacterString'
       );
结果:

DOCUMENTATION                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
------------------------------------
cf40a39a-0721-4fd4-84f3-adc28aee1158

谢谢,但这似乎并没有从xml中获取值cf40a39a-0721-4fd4-84f3-adc28aee1158,如果我在您的回答中选择名称,则会显示名称,但除去此项,xml中不会显示任何内容-我需要字符串之间的文本tag@MapMan好的,我的测试中只有name列。我已将其从查询中删除。但是查询的结果应该是您想要的:cf40a39a-0721-4fd4-84f3-ADC28AEE1158我遗漏了我添加的示例xml上的一个标记,但是在传递关键字之前,我已将“\metadata”替换为“\gmd:GEMINI_metadata”,但什么都没有appears@MapMan您只需要调整路径。路径'gmd:GEMINI_Metadata/gmd:fileIdentifier/gco:CharacterString'完美,感谢您的帮助!