【问题标题】:Ckeck the presence of xml tag using oracle使用 oracle 检查是否存在 xml 标签
【发布时间】:2012-12-13 16:09:03
【问题描述】:
 <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 developer中声明existnode时出错。

【问题讨论】:

  • 最好发布您的实际代码。您问如何检测 SQL 中的特定节点,每个人都回答了。这就是为什么最好展示你过去的努力和研究的原因。如果您发布您的触发代码和您所做的错误消息,那么也许人们可以提供更好的帮助?
  • CREATE TRIGGER Tab_aBEFORE INSERTFOR EACH ROWdeclarexml_a xmltype;beginxml_a:=xmltype(:new.value);--here i have to check if "wbi:value" exists in the xml clob and then----insert function@9

标签: sql xml oracle oracle-sqldeveloper clob


【解决方案1】:

是的,使用存在节点:

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

【讨论】:

  • 谢谢 :) 但是当我在表名为“yourdata”的触发器中使用它时,如果我在 select 语句中再次提到“yourdata”,它会显示错误。可以在触发器内的多少个 select 语句中使用相同的表名,其中 select statemt 内的表名和触发器表相同?
  • 带有部分的 yourdata 只是我的示例。如果您的意思是触发器在带有 clob 列的表上,只需将 clob 列引用为 v_exists := xmltype(:new.clobcolumn).existsNode('xpath', 'namespace'); 请粘贴您的触发器代码以获得更完整的响应。
  • CREATE TRIGGER Tab_aBEFORE INSERTFOR EACH ROWdeclarexml_a xmltype;beginxml_a:=xmltype(:new.value);xml_a:=xmltype(:new.value);--here i have to check if "wbi:value" exists in the xml clob and then@98765436@s@pan>@98765436@s@pan
  • 好吧 if(xml_a.existsNode('/wbi:event/wbi:appData/wbi:content','xmlns:wbi="foo"') =1) 然后
【解决方案2】:
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;

【讨论】:

  • 谢谢,但它没有帮助 :( 它说 existsNode 没有声明......我正在尝试在触发器中执行上述操作。
  • existsNode() 在 10g 中应该可以正常工作。你的数据库是什么版本的?
【解决方案3】:

其实你可以使用oracle的instr函数,速度很快。

喜欢:

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

【讨论】:

  • 如果字符串 'wbi:value' 不是作为标签出现在某个地方,这也会匹配。
  • 到底谁愿意在标签中不写“wbi:value”?无论如何,这段代码不是最终的,所以可以写成'
【解决方案4】:

你可以使用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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-08
    • 2023-04-02
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    相关资源
    最近更新 更多