【问题标题】:Blob to Varchar Conversion IssueBlob 到 Varchar 的转换问题
【发布时间】:2020-02-12 23:39:01
【问题描述】:

我有以下选择语句。

SELECT REPLACE(UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(GDTXFT,2000,1)),CHR(0),'') as GDTXFT
from f00165;

这会导致以下错误消息。

错误代码:29275,错误消息:ORA-29275:部分多字节字符。

GDTXFT 使用BLOB 数据类型定义。

环顾四周,我了解到substr 函数将字节切成两半,这导致将字节转换为字符时出现问题。有没有办法摆脱错误?

我要做的就是将 BLOB 列转换为 Varchar 列。但到目前为止,我找不到任何其他方法来做到这一点。有没有其他方法可以实现这一目标?非常感谢任何建议。

【问题讨论】:

  • 数据库列类型是 BLOB 而不是 CLOB 的任何特殊原因?
  • 您需要先将完整的BLOB转换为CLOB,然后您可以提取子字符串,例如使用this

标签: sql oracle11g blob


【解决方案1】:

我处理相同问题的方法是以十六进制从 DB2 中提取数据,但将其转换为 VARCHAR。结果数据集作为 VARCHAR 列存储在 MSSQL 暂存表中。最后一步是读取这个具有 HEX 值的 VARCHAR 列并将它们转换为 ASCII 字符。以上所有步骤均使用 SSIS 执行。 这是使用的两个 MS SQL 表。第一个表 F00165_stage 用于存储来自 DB2 的数据。 cmets 列将 HEX 数据存储为 VARCHAR。第二个最终表是存储转换为 ASCII 字符的 HEX 数据。

CREATE TABLE [dbo].[F00165_stage](
[SDKCOO] [nvarchar](5) NULL,
[SDDOCO] [int] NULL,
[SDDCTO] [nvarchar](2) NULL,
[SDLNID] [int] NULL,
[comments] [nvarchar](500) NULL
) ON [PRIMARY]
CREATE TABLE [dbo].[final_table](
[SDKCOO] [nvarchar](5) NULL,
[SDDOCO] [int] NULL,
[SDDCTO] [nvarchar](2) NULL,
[SDLNID] [int] NULL,
[comments] [nvarchar](100) NULL
) ON [PRIMARY]

这里是使这项工作的脚本。我正在检索存储在 F00165 中的销售 cmets (F4211)。 第一步是从 JDE 检索数据。链接到 F00165 的密钥可能以不同的方式存储,因此请根据需要进行必要的更改。

SELECT sd.sdkcoo 
,sd.sddoco 
,sd.sddcto 
,sd.sdlnid 
,CAST(HEX(gd.gdtxft) AS VARCHAR(500)) comments
FROM F4211 sd
LEFT JOIN F00165 gd ON gd.gdobnm='GT4211A' AND gd.gdtxky=sd.sddoco || '|' || sd.sddcto || '|' || sd.sdkcoo || '|' || CAST((sd.sdlnid / 1000)  AS NUMERIC(8,3))
WHERE 1=1
AND CAST(HEX(gd.gdtxft) AS VARCHAR(500)) IS NOT NULL

第二步是在最终表中插入 JDE 记录。

INSERT INTO final_table
SELECT sdkcoo,sddcto,sddoco,sdlnid,'' AS comments
FROM F4211_stage

最后一步是对 HEX (cmets) 列执行更新。这会将 HEX 值转换为 ASCII 字符。

UPDATE ft SET ft.comments=SUBSTRING(CONVERT(VARCHAR(MAX), CONVERT(VARBINARY(MAX), REPLACE(st.comments,'00',''), 2)),1,100)
FROM final_table ft
JOIN F4211_stage st ON st.sdkcoo=ft.sdkcoo AND st.sddoco=ft.sddoco AND st.sddcto=ft.sddcto AND st.sdlnid=ft.sdlnid

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 2019-04-12
    • 2016-03-18
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多