【问题标题】:How to remove a node from XML in Oracle?如何从 Oracle 中的 XML 中删除节点?
【发布时间】:2016-02-07 02:47:29
【问题描述】:

我想从 Oracle 中的 XML 中删除一个节点。我在删除节点时遇到问题:

下面是我的 XML:

    </TRB_TRX>
<DATA>
        <Request APIType="null">
            <SubscriberIdsInfo>
                <ExternalId>
                    <ExternalId>8034204058</ExternalId>
                </ExternalId>
                <SubscriberId>
                    <SubscrNumber/>
                </SubscriberId>
            </SubscriberIdsInfo>
            <Services>
                <Soc>88371664</Soc>
                <ServiceAgreementSequenceNo/>
                <DealerCode/>
                <DeployMode/>
                <EffectiveDate>2014-10-16T00:00:00</EffectiveDate>
                <ExpirationDate/>
                <OfferInstanceId/>
            </Services>
            <Services>
                <Soc>911143659</Soc>
                <ServiceAgreementSequenceNo/>
                <DealerCode/>
                <DeployMode/>
                <EffectiveDate>2014-10-16T00:00:00</EffectiveDate>
                <ExpirationDate/>
                <OfferInstanceId/>
            </Services>
            <Services>
                <Soc>42132</Soc>
                <ServiceAgreementSequenceNo/>
                <DealerCode/>
                <DeployMode/>
                <EffectiveDate>2014-10-16T00:00:00</EffectiveDate>
                <ExpirationDate/>
                <OfferInstanceId/>
            </Services>
            <SubParameters>
                <Name>PoolID</Name>
                <Values>B287024769280MDVCPOOL</Values>
                <EffectiveDate>2014-10-16T14:08:37</EffectiveDate>
                <ExpirationDate/>
            </SubParameters>
            <ActivityInfo/>
        </Request>
    </DATA>
</TRB_TRX>

我想在下面删除

    <Services>
                <Soc>88371664</Soc>
                <ServiceAgreementSequenceNo/>
                <DealerCode/>
                <DeployMode/>
                <EffectiveDate>2014-10-16T00:00:00</EffectiveDate>
                <ExpirationDate/>
                <OfferInstanceId/>
            </Services>
            <Services>  

    <Services>
                    <Soc>88371664</Soc>
                    <ServiceAgreementSequenceNo/>
                    <DealerCode/>
                    <DeployMode/>
                    <EffectiveDate>2014-10-16T00:00:00</EffectiveDate>
                    <ExpirationDate/>
                    <OfferInstanceId/>
                </Services>
                <Services>

我的最终输出应该如下所示

    </TRB_TRX>
        <DATA>
            <Request APIType="null">
                <SubscriberIdsInfo>
                    <ExternalId>
                        <ExternalId>8034204058</ExternalId>
                    </ExternalId>
                    <SubscriberId>
                        <SubscrNumber/>
                    </SubscriberId>
                </SubscriberIdsInfo>
                <Services>
                    <Soc>911143659</Soc>
                    <ServiceAgreementSequenceNo/>
                    <DealerCode/>
                    <DeployMode/>
                    <EffectiveDate>2014-10-16T00:00:00</EffectiveDate>
                    <ExpirationDate/>
                    <OfferInstanceId/>
                </Services>
                <SubParameters>
                    <Name>PoolID</Name>
                    <Values>B287024769280MDVCPOOL</Values>
                    <EffectiveDate>2014-10-16T14:08:37</EffectiveDate>
                    <ExpirationDate/>
                </SubParameters>
                <ActivityInfo/>
            </Request>
        </DATA>
    </TRB_TRX>

我正在使用下面的 SQL 查询

UPDATE trb1_sub_errs SET general_data = deleteXML(general_data,'//DATA/Request/Services[1]') where SUB_TRX_ID=1242403029;

我收到以下错误

ERROR at line 1:
ORA-00932: inconsistent datatypes: expected - got CHAR

【问题讨论】:

  • 你能像我展示的那样从 SQL*Plus 发布会话吗?编辑您的问题并复制粘贴您的会话。并且还要提到精确的版本,最多四位小数。

标签: sql xml oracle


【解决方案1】:

我没有看到任何错误。唯一的区别是我在查询中没有任何谓词。

SQL> CREATE TABLE trb1_sub_ers AS
  2  select XMLTYPE('<TRB_TRX>
  3  <DATA>
  4          <Request APIType="null">
  5              <SubscriberIdsInfo>
  6                  <ExternalId>
  7                      <ExternalId>8034204058</ExternalId>
  8                  </ExternalId>
  9                  <SubscriberId>
 10                      <SubscrNumber/>
 11                  </SubscriberId>
 12              </SubscriberIdsInfo>
 13              <Services>
 14                  <Soc>88371664</Soc>
 15                  <ServiceAgreementSequenceNo/>
 16                  <DealerCode/>
 17                  <DeployMode/>
 18                  <EffectiveDate>2014-10-16T00:00:00</EffectiveDate>
 19                  <ExpirationDate/>
 20                  <OfferInstanceId/>
 21              </Services>
 22              <Services>
 23                  <Soc>911143659</Soc>
 24                  <ServiceAgreementSequenceNo/>
 25                  <DealerCode/>
 26                  <DeployMode/>
 27                  <EffectiveDate>2014-10-16T00:00:00</EffectiveDate>
 28                  <ExpirationDate/>
 29                  <OfferInstanceId/>
 30              </Services>
 31              <Services>
 32                  <Soc>42132</Soc>
 33                  <ServiceAgreementSequenceNo/>
 34                  <DealerCode/>
 35                  <DeployMode/>
 36                  <EffectiveDate>2014-10-16T00:00:00</EffectiveDate>
 37                  <ExpirationDate/>
 38                  <OfferInstanceId/>
 39              </Services>
 40              <SubParameters>
 41                  <Name>PoolID</Name>
 42                  <Values>B287024769280MDVCPOOL</Values>
 43                  <EffectiveDate>2014-10-16T14:08:37</EffectiveDate>
 44                  <ExpirationDate/>
 45              </SubParameters>
 46              <ActivityInfo/>
 47          </Request>
 48      </DATA>
 49  </TRB_TRX>') general_data from dual;

Table created.

SQL>
SQL> UPDATE trb1_sub_ers SET general_data = deleteXML(general_data, '//DATA/Request/Services[1]');

1 row updated.

SQL>

所以,检查SUB_TRX_ID的数据类型,是不是字符串,因为你是在比较数字。

【讨论】:

  • Lalit,我仍然看到同样的错误 SQL> UPDATE trb1_sub_errs SET general_data = deleteXML(general_data, '//DATA/Request/Services[1]');更新 trb1_sub_errs SET general_data = deleteXML(general_data, '//DATA/Request/Services[1]') * 第 1 行出现错误:ORA-00932:不一致的数据类型:预期 - 得到 CHAR
  • 您能否像我展示的那样从 SQL*Plus 发布会话。并且还要提到精确的版本,最多四位小数。
  • SQL*Plus:版本 11.2.0.3.0
  • ORA-60019:在范围大小的表空间中创建大小为 14 的初始范围,这就是我得到的
  • 那么,你的意思是现在错误已经改变了?为什么不复制粘贴SQL*Plus 的会话,就像我在回答中展示的那样。它将显示错误的确切来源。只需打开 SQL*plus,然后执行更新语句。通过编辑您的问题,将整个内容复制粘贴到您的问题中。
猜你喜欢
  • 2019-04-12
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
  • 2014-09-13
相关资源
最近更新 更多