我有一个带有blob列的表,其中包含十六进制格式的xml数据。
示例表:
| 栏目|数据类型|
| - -----|- -----|
| 得救了|时间戳|
| 客户ID|整数|
| XML_日期|blob(16777216)|
当我像这样查询时:
SELECT SAVED, CUST_ID, XML_DATA
FROM FOO_TABLE
WHERE CUST_ID = 1234
我得到以下结果:
| 得救了|客户ID| XML数据|
| - -----|- -----|- -----|
| 2023-06-07 2023-06-07|一二三四|x'3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D225554462D38223F3E0A3C6E6F7465732076657273696F6E3D2231223E0A093C6C6162656C733E0A09093C6C6162656C2069643D2220636F6C6 F723D22333044424646223E4C6162656C20313C2F6C6162656C3E'|
现在,如果我取十六进制数,减去开始x'和结束',并将其插入converter中,我会得到以下结果:
<?xml version="1.0" encoding="UTF-8"?>
<notes version="1">
<labels>
<label id="0" color="30DBFF">Label 1</label>
我们的目标是在DB2中实现这一点。我试过很多种方法都没有用,甚至加入了chatGPT。
select cast(hex(xml_data) as varchar(1000))as cnv_xml
结果:
SQL0171N The statement was not processed because the data type, length or
value of the argument for the parameter in position "1" of routine
"SYSIBM.HEX" is incorrect. Parameter name: "". SQLSTATE=42815
然后
SELECT TRANSLATE(
CAST(XML_DATA AS VARCHAR(1000) CCSID UNICODE),
'0123456789ABCDEF',
x'0123456789ABCDEF'
) as CNV_XML
给予
SQL0622N The clause "CCSID UNICODE" is invalid for this database.
SQLSTATE=56031
最后,一个运行,但只是吐回原来的十六进制
SELECT TRANSLATE(
CAST(XML_DATA AS VARCHAR(1000) FOR BIT DATA),
'0123456789ABCDEF',
x'0123456789ABCDEF'
) as CNV_XML
我很确定我没有创建函数或更改解释表unicode设置的权限。
有没有办法转换这些斑点或我SOOL?谢谢
2条答案
按热度按时间wh6knrhe1#
您的数据不是以十六进制存储的,它只是纯文本。
看起来像这样,因为blob数据就是这样显示的。
您可以将其转换为varchar以查看其显示为文本。不要使用HEX或Translate,utf-8的ccsid也是1208。
o75abkj42#
您必须在BLOB字段中真正拥有XML文档的BLOB表示。而不仅仅是一些“类似xml内容的二进制字符串”。
也就是说,如果
XMLPARSE (DOCUMENT XML_DATA)
没有返回正确的XML文档,您必须自己对XML_DATA内容做一些事情,使其工作如下。示例中XML文档的字符串表示形式被转换为BLOB以重现XML_DATA列内容。请注意,您的“转换器输出”显示不正确的文档-没有尾随的
</labels></notes>
标记。然后使用XMLPARSE
解析它,并使用XMLSERIALIZE
将其转换为CLOB。您可以使用
XMLTABLE
函数来获取所需XML文档的一些元素或属性。| 已保存|客户ID| CNV_XML|标签_元素|标签ID|标签_颜色|注解_版本|
| - -----|- -----|- -----|- -----|- -----|- -----|- -----|
| 2023-06-07 2023-06-07|一二三四|标签1|标签1| 0| 30DBFF| 1|