DB2将包含HEX的blob转换为ascii

bd1hkmkf  于 12个月前  发布在  DB2
关注(0)|答案(2)|浏览(127)

我有一个带有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?谢谢

wh6knrhe

wh6knrhe1#

您的数据不是以十六进制存储的,它只是纯文本。
看起来像这样,因为blob数据就是这样显示的。
您可以将其转换为varchar以查看其显示为文本。不要使用HEX或Translate,utf-8的ccsid也是1208。

SELECT SAVED, CUST_ID, CAST(XML_DATA AS VARCHAR(32764))
       FROM FOO_TABLE
       WHERE CUST_ID = 1234
o75abkj4

o75abkj42#

您必须在BLOB字段中真正拥有XML文档的BLOB表示。而不仅仅是一些“类似xml内容的二进制字符串”。
也就是说,如果XMLPARSE (DOCUMENT XML_DATA)没有返回正确的XML文档,您必须自己对XML_DATA内容做一些事情,使其工作如下。
示例中XML文档的字符串表示形式被转换为BLOB以重现XML_DATA列内容。请注意,您的“转换器输出”显示不正确的文档-没有尾随的</labels></notes>标记。然后使用XMLPARSE解析它,并使用XMLSERIALIZE将其转换为CLOB。
您可以使用XMLTABLE函数来获取所需XML文档的一些元素或属性。

WITH FOO_TABLE (SAVED, CUST_ID, XML_DATA) AS (
VALUES 
(
  '2023-06-07'::DATE
, 1234
, CAST ('<?xml version="1.0" encoding="UTF-8"?>
<notes version="1">
<labels>
        <label id="0" color="30DBFF">Label 1</label>
</labels>
</notes>'
AS BLOB (1K))
)
)
SELECT 
  T.SAVED
, T.CUST_ID
-- XML as CLOB
, XMLSERIALIZE (XMLPARSE (DOCUMENT XML_DATA) AS CLOB (1K))
    AS CNV_XML
-- XML elements & attributes as relational columns  
, X.LABEL_ELEMENT
, X.LABEL_ID
, X.LABEL_COLOR
, X.NOTES_VERSION
FROM 
  FOO_TABLE T
-- If you want to get XML elements & attributes
, XMLTABLE 
('$D/notes/labels/label' PASSING XMLPARSE (DOCUMENT XML_DATA) AS "D"
  COLUMNS
    LABEL_ELEMENT   VARCHAR (128)   PATH '.'
  , LABEL_ID        INT             PATH '@id'
  , LABEL_COLOR     VARCHAR (128)   PATH '@color'
  , NOTES_VERSION   INT             PATH '../../@version'
) X

| 已保存|客户ID| CNV_XML|标签_元素|标签ID|标签_颜色|注解_版本|
| - -----|- -----|- -----|- -----|- -----|- -----|- -----|
| 2023-06-07 2023-06-07|一二三四|标签1|标签1| 0| 30DBFF| 1|

相关问题