我必须更新存储在Oracle 11G中的BLOB列中的XML值 . BLOB存储了一个comlete XML文件,我必须在其中更新一些值并将其保存为BLOB . 如何通过blob转换和XMLQUERY以及XMLUPDATE轻松地选择和更新数据?任何代码示例?
先感谢您 .
以下是一些更多细节:
这是表的ddl:
CREATE TABLE MAPSHEET
(
MAPSHEETID NUMBER (14,0) NOT NULL,
NAME VARCHAR2 (64) NOT NULL,
STRUCTURE BLOB,
)
blob col STRUCTURE中的xml数据
<MapSheet Version="1.0">
<Frame>
<JobId>9022165</JobId>
<LayoutId>24807064</LayoutId>
<Blocks>
<Block MapFieldMask="true" CompressText="false" CombineRaster="false">
<Name>layout</Name>
<StyleId>24808857</StyleId>
<LayoutLayers>0 1</LayoutLayers>
<BlockScale/>
<JobItemIds/>
</Block>
<Block MapFieldMask="true" CompressText="false" CombineRaster="false">
<Name>karto</Name>
<StyleId>24809031</StyleId>
<LayoutLayers>4</LayoutLayers>
<BlockScale/>
<JobItemIds>
<JobItemId>9083675</JobItemId>
<JobItemId>9088148</JobItemId>
</JobItemIds>
</Block>
<Block MapFieldMask="true" CompressText="false" CombineRaster="false">
<Name>hel</Name>
<StyleId>24809032</StyleId>
<LayoutLayers>-</LayoutLayers>
<BlockScale/>
<JobItemIds>
<JobItemId>9022173</JobItemId>
<JobItemId>25403646</JobItemId>
</JobItemIds>
</Block><Block MapFieldMask="true" CompressText="false" CombineRaster="false">
<Name>shade glacier</Name>
<StyleId>24809041</StyleId>
<LayoutLayers>-</LayoutLayers>
<BlockScale/>
<JobItemIds>
<JobItemId>24806040</JobItemId>
</JobItemIds>
</Block>
<Block MapFieldMask="true" CompressText="false" CombineRaster="false">
<Name>shade</Name>
<StyleId>24809040</StyleId>
<LayoutLayers>-</LayoutLayers>
<BlockScale/>
<JobItemIds>
<JobItemId>24806038</JobItemId>
</JobItemIds>
</Block>
</Blocks>
<Offset X="0" Y="0"/>
<Name>DS</Name>
</Frame></MapSheet>
这个简单的SELECT获取数据不起作用:
SELECT x.MapSheet
FROM XmlTable('/MapSheet') PASSING XmlType(MAPSHEET.STRUCTURE,1)
COLUMS "XML" VARCHAR2(300) PATH 'MapSheet') AS x;
如何从blob列中选择/更新所需的xml数据?
2 回答
要从XML中进行选择,您可以使用
ExtractValue(XmlType, XPath)
或XmlTable
将Xml clob转换为可查询的XML表 . 对于BLOB转换,您应该能够用XmlType(blob_value, 1)
包装它,然后您可以在其上执行任何与XML相关的功能 .或使用
XmlTable
使用UpdateXml,假设我正在更新的记录在列中包含上述XML:
以上应该更新
node2
,其值为value2b
,现在改为value2z
. 然后返回新XML并将其分配给匹配data_id = 1
的记录中的xml_data
列 .请注意,在上面的查询中,它使用的是一个已经是XmlType类型的列 . 您正在使用
BLOB
. 我会问,是否有理由将其作为BLOB
而不是CLOB
或XmlType
?如果要存储VARCHAR
类型数据,则应该使用后两种类型之一,如果要存储各种VARCHAR
数据,则为CLOB
;如果存储严格的XML数据,则为XmlType
(无论如何都是CLOB
的更具体类型) .如果您使用
BLOB
数据类型,则需要执行大量转换 . 使用XmlType(blob_data, 1)
可以让你从BLOB
到XmlType
,但回去你可能需要使用UTL_RAW.CAST_TO_RAW(xml_data)
. 所以查询将成为:这是一个独立的工作示例,显示了上面提到的各种方法:
将一些xml文档插入表中 .
查看插入的xml .
xmltype(blob,csid -charset enocoding id '0' is default)
使用xmlquery将
<description>
更改为<descriptionNew>
. 它也可用于更新语句update testxmlBlob set p = XMLQuery(....) ...
Other example how to use xmlquery to update