0
 <wbi:appData>
     <wbi:content wbi:name="1st_status">
         <wbi:value xsi:type="xsd:string">Success</wbi:value>
     </wbi:content>
</wbi:appData>

此 xml 位于一个表中,该表具有 CLOB 类型的列。

我想找出这个 xml 中是否存在“wbi:value”标签?

我尝试使用existnode,但在sql developer中声明existnode时出错。

4

4 回答 4

3

是的,使用存在节点:

SQL> with yourdata as (select to_clob('<wbi:event xmlns:wbi="http://foo" xmlns:xsi="http://x" xmlns:xsd="http://d">
  2  <wbi:appData>
  3      <wbi:content wbi:name="1st_status">
  4          <wbi:value xsi:type="xsd:string">Success</wbi:value>
  5          </wbi:content>
  6      <wbi:content wbi:name="2nd_status">
  7          <wbi:value xsi:type="xsd:string">Failure</wbi:value>
  8          </wbi:content>
  9      </wbi:appData>
 10  </wbi:event>') c from dual)
 11  select existsnode(xmltype(c), '/wbi:event/wbi:appData/wbi:content','xmlns:wbi="http://foo"')  is_exist
 12    from yourdata t
 13  /

  IS_EXIST
----------
         1

IE

existsnode(xmltype(c), '/wbi:event/wbi:appData/wbi:content','xmlns:wbi="http://foo"')

1 = 存在 0 = 不存在。

请注意,在我的示例中,我有两个匹配的节点(因为我没有过滤 wbi:name)。你当然可以过滤xpath。例如:

/wbi:event/wbi:appData/wbi:content[@wbi:name="1st_status"]

将匹配限制为“1st_status”之一

于 2012-12-13T16:30:51.790 回答
1
select count(*) 
 from clobtab
where existsNode(xmltype.createxml(clobcol),'/wbi:appData/wbi:content/wbi:value') = 1;

如果它的重复次数超过 0,则它存在,否则不存在。

所以你的触发器是-

CREATE TRIGGER Tab_a 
BEFORE INSERT 
FOR EACH ROW 
declare 
   xml_a xmltype; 
begin 
   xml_a:=xmltype(:new.value); 
   if existsNode(xml_a,'/wbi:appData/wbi:content/wbi:value','xmlns:wbi="http://pat.namespace.com"') = 1
   then 
     ----insert .... 
   end if;
end;
于 2012-12-13T16:14:58.557 回答
0

实际上你可以使用 oracle 的 instr 函数,它很快。

喜欢:

where instr(field, 'wbi:value') > 0
于 2012-12-13T16:39:15.450 回答
0

您可以使用XMLEXISTS

SELECT DESCRIPTOR_XML FROM TABLE_WITH_AN_XMLTYPE_COLUMN
WHERE
  XMLEXISTS('//functions[function/arg[@name="class.name" and not(starts-with(., "com.example.apps.YouShantSeeMeClass"))]]'
  PASSING BY VALUE DESCRIPTOR_XML);
于 2014-02-24T12:19:40.413 回答