使用oracle检查是否存在xml标记

时间:2012-12-13 16:09:04

标签: sql xml oracle oracle-sqldeveloper clob

 <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”标签?

我尝试使用existsnode,但是在sql开发人员中,它说的是声明existsnode的错误。

4 个答案:

答案 0 :(得分:3)

是使用existsnode:

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

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”一个

答案 1 :(得分: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;

答案 2 :(得分:0)

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

像:

where instr(field, 'wbi:value') > 0

答案 3 :(得分: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);