Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我想使用sql从XML存储为clob的表中提取标记名。(甲骨文)_Sql_Xml_Oracle_Parsing_Clob - Fatal编程技术网

我想使用sql从XML存储为clob的表中提取标记名。(甲骨文)

我想使用sql从XML存储为clob的表中提取标记名。(甲骨文),sql,xml,oracle,parsing,clob,Sql,Xml,Oracle,Parsing,Clob,示例XML如下所示: <Root> ... <XMLNSC> ... <SOAP-ENV:Envelope> ... <SOAP-ENV:Body> <typesNS0:getABCD xmlns:typesNS0="http://xxx.xx/xxxxxx/xxxxxxxxx/x/" xmlns:xalan="http://xml.apache.org/xslt"> 最后一个标记类型ns0:getbao要选择,如果要获得准确的标记值

示例XML如下所示:

<Root>
...
<XMLNSC>
...
<SOAP-ENV:Envelope>
...
<SOAP-ENV:Body>
<typesNS0:getABCD xmlns:typesNS0="http://xxx.xx/xxxxxx/xxxxxxxxx/x/" xmlns:xalan="http://xml.apache.org/xslt">

最后一个标记类型ns0:getbao要选择

,如果要获得准确的标记值,可以在脚本下面运行

select xmltype(a).extract('//typesNS0:getABCD','xmlns:typesNS0="http://xxx.xx/xxxxxx/xxxxxxxxx/x/"')
from (
  select 
  '<Root xmlns:SOAP-ENV="http://a.b.org/">
    <XMLNSC />
    <SOAP-ENV:Envelope/>
    <SOAP-ENV:Body/>
    <typesNS0:getABCD xmlns:typesNS0="http://xxx.xx/xxxxxx/xxxxxxxxx/x/" xmlns:xalan="http://xml.apache.org/xslt">123</typesNS0:getABCD>
  </Root>' a from dual
)
DECLARE
vs_Xml VARCHAR2(32000):= '<Root xmlns:SOAP-ENV="http://a.b.org/">
<XMLNSC />
<SOAP-ENV:Envelope/>
<SOAP-ENV:Body/>
<typesNS0:getABCD xmlns:typesNS0="http://xxx.xx/xxxxxx/xxxxxxxxx/x/"    xmlns:xalan="http://xml.apache.org/xslt">123</typesNS0:getABCD>
</Root>';

vx_ParameterList   XMLTYPE;
vx_Parameter       XMLTYPE;
vn_ParameterIndex  NUMBER;
vs_Key             VARCHAR2(64);
vs_XPath           VARCHAR2(255);
vs_Value           VARCHAR2(10000);

BEGIN
vx_ParameterList := xmltype(vs_Xml);
vn_ParameterIndex := 1;
vs_XPath := '/Root'; 

WHILE vx_ParameterList.existsNode(vs_XPath || '[' || vn_ParameterIndex || ']') = 1 LOOP
vx_Parameter := vx_ParameterList.extract(vs_XPath || '[' || vn_ParameterIndex || ']');

 vs_Value := vx_Parameter.extract('//typesNS0:getABCD/text()','xmlns:typesNS0="http://xxx.xx/xxxxxx/xxxxxxxxx/x/"').GetStringVal();
vn_ParameterIndex := vn_ParameterIndex + 1;

dbms_output.put_line(vs_Value);
END LOOP;

END;

你能写出你想要提取的正确的xml和标记吗?当然可以。我知道如何用EXTRACVALUE命令选择值,但我不知道如何选择标记只使用extract函数