我需要删除 XML 的某些部分(来自 DBMS_METADATA 的表定义)。找到 XMLPATCH 并使其适用于非常小的示例 XML。但我面临两个问题:一大一小。
- 最大的问题是下面的查询填满了所有实例的 PGA (PGA_TARGET=8GB),如果我在带有表定义的真实 25KB XML 上使用它。
- 小问题是我在 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;
```