XML の特定の部分 (DBMS_METADATA からのテーブル定義) を削除する必要があります。XMLPATCH を見つけて、以下の非常に小さな XML の例で動作するようにしました。しかし、私は 2 つの問題に直面しています。1 つは大きな問題で、もう 1 つは小さな問題です。
- 大きな問題は、テーブル定義を含む実際の 25KB XML で使用すると、以下のクエリがインスタンスの PGA (PGA_TARGET=8GB) をすべて埋めてしまうことです。
- 小さな問題は、PL/SQL でそれを使用しているため、ネイティブ PL/SQL が SELECT FROM DUAL よりも優れていることです。
以下を最適化して /ROWSET[1]/ROW[1]/TABLE_T[1]/CON1_LIST[1] を最小限のメモリ使用量で適切に削除する方法を知っている人はいますか?
以下をPL/SQLコードに書き直す方法を知っている人はいますか?
SELECT XMLPATCH ( XMLTYPE( '<?xml version="1.0"?>
<ROWSET><ROW><TABLE_T><VERS_MAJOR>2</VERS_MAJOR><MAXTRANS>0</MAXTRANS>
<CON1_LIST><CON1_LIST_ITEM><OWNER_NUM>115</OWNER_NUM></CON1_LIST_ITEM></CON1_LIST>
<BHIBOUNDVAL empty="blob"/><PHYPART_NUM>10</PHYPART_NUM></TABLE_T></ROW></ROWSET>')
, XMLTYPE( '<?xml version="1.0"?>
<xd:xdiff xsi:schemaLocation="http://xmlns.oracle.com/xdb/xdiff.xsd
http://xmlns.oracle.com/xdb/xdiff.xsd"
xmlns:xd="http://xmlns.oracle.com/xdb/xdiff.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<?oracle-xmldiff operations-in-docorder="true" output-model="snapshot" diff-algorithm="global"?>
<xd:delete-node
xd:node-type="element"
xd:xpath="/ROWSET[1]/ROW[1]/TABLE_T[1]/CON1_LIST[1]"/>
</xd:xdiff>')
)
FROM DUAL;
```