#sql #xml #database #oracle #cdata
#sql #xml #База данных #Oracle #cdata
Вопрос:
Это часть моего XML:
<EO Name="oracle.apps.hcm.goals.core.publicModel.entity.GoalMeasurementEO">
<![CDATA[0001FFFFFFFF]]>
<GoalMeasurementEORow PS="0" Hdl="16" PK="Y" CI="Y" AV="111111111111111111111111111111">
<MeasurementId>
<DATA null="true"/>
</MeasurementId>
</GoalMeasurementEORow>
</EO>
<EO Name="oracle.apps.hcm.goals.core.publicModel.entity.GoalMeasurementEO">
<![CDATA[00010000000EACED00057708000110D943311B2F]]>
<GoalMeasurementEORow PS="0" Hdl="1019" PK="Y" CI="Y" AV="">
<MeasurementId>
<DATA>300000297949999</DATA>
</MeasurementId>
<BusinessGroupId>
<DATA>1</DATA>
</BusinessGroupId>
</EO>
Мне нужно удалить узел EO с <![CDATA[0001FFFFFFFF]]>
помощью, через таблицу, используя Oracle. Этот XML хранится в XM_DATA_CACHE XMLTYPE.
Есть ли способ удаления на основе CDATA
Конечный результат должен быть
<EO Name="oracle.apps.hcm.goals.core.publicModel.entity.GoalMeasurementEO">
<![CDATA[0001FFFFFFFF]]>
<GoalMeasurementEORow PS="0" Hdl="16" PK="Y" CI="Y" AV="111111111111111111111111111111">
<MeasurementId>
<DATA null="true"/>
</MeasurementId>
</GoalMeasurementEORow>
</EO> ```
Ответ №1:
Прежде всего, ваш xml поврежден: второй тег GoalMeasurementEORow
не закрыт, а также, поскольку это всего лишь часть xml, у него нет корневого тега.
В любом случае, я исправил ваш xml, чтобы показать, как вы можете удалить cdata
его из своего xml.
Пожалуйста, посмотрите на следующий пример:
-- sample data:
with t(x) as (
select xmltype(q'{
<ROOT>
<EO Name="oracle.apps.hcm.goals.core.publicModel.entity.GoalMeasurementEO">
<![CDATA[0001FFFFFFFF]]>
<GoalMeasurementEORow PS="0" Hdl="16" PK="Y" CI="Y" AV="111111111111111111111111111111">
<MeasurementId>
<DATA null="true"/>
</MeasurementId>
</GoalMeasurementEORow>
</EO>
<EO Name="oracle.apps.hcm.goals.core.publicModel.entity.GoalMeasurementEO">
<![CDATA[00010000000EACED00057708000110D943311B2F]]>
<GoalMeasurementEORow PS="0" Hdl="1019" PK="Y" CI="Y" AV="">
<MeasurementId>
<DATA>300000297949999</DATA>
</MeasurementId>
<BusinessGroupId>
<DATA>1</DATA>
</BusinessGroupId>
</GoalMeasurementEORow>
</EO>
</ROOT>
}')
from dual)-- end of sample data
-- main query:
select
XMLQuery(
'copy $i := $p1 modify
(for $j in $i//EO
let $o := <EO >{$j/@*}{ $j/node()[name() ne ""]}</EO>
return replace node $j with $o
)
return $i'
PASSING t.x AS "p1"
returning content
) xdata_new
from t;
Результаты:
XDATA_NEW
----------------------------------------------------------------------------------
<ROOT>
<EO Name="oracle.apps.hcm.goals.core.publicModel.entity.GoalMeasurementEO">
<GoalMeasurementEORow PS="0" Hdl="16" PK="Y" CI="Y" AV="111111111111111111111111111111">
<MeasurementId>
<DATA null="true"/>
</MeasurementId>
</GoalMeasurementEORow>
</EO>
<EO Name="oracle.apps.hcm.goals.core.publicModel.entity.GoalMeasurementEO">
<GoalMeasurementEORow PS="0" Hdl="1019" PK="Y" CI="Y" AV="">
<MeasurementId>
<DATA>300000297949999</DATA>
</MeasurementId>
<BusinessGroupId>
<DATA>1</DATA>
</BusinessGroupId>
</GoalMeasurementEORow>
</EO>
</ROOT>
Как вы можете видеть, я заменяю все дочерние узлы EO
их содержимым, и CDATA исчезает.
Комментарии:
1. Извините, мой вопрос не был ясен. Я не хочу удалять CDATA. Я хочу удалить запись, которая имеет CDATA= 0001FFFFFFFF, а затем обновить xml обратно в столбец clob. Столбец Clob data_cache содержит 2 записи, как указано выше. Я хочу удалить первую запись, используя значение CDATA, а затем обновить новый xml обратно в столбец clob.
2. @TChalla ах, хорошо, это намного проще, посмотрите на это: gist.github.com/xtender/c1ba1d987d062fed2d661a9fab0ead2d
3. Привет, похоже, он работает неправильно. Я все еще вижу узел
GoalMeasurementEO"> <![CDATA[0001FFFFFFFF]]>
в результатах4. @TChalla ах, извините, ошибка копирования-вставки. Пожалуйста, посмотрите на правильный: gist.github.com/xtender/c1ba1d987d062fed2d661a9fab0ead2d
5. Большое спасибо, Саян. Это было очень полезно !!