使用Oracle 11g数据库和表中的NCLOB列,我试图用另一个文本替换一些文本。在高层次上,它非常简单,我在SQL脚本的SQL Server上成功完成了它,但是对于Oracle来说,事情变得越来越复杂,主要是因为NCLOB列中的数据可以轻松超过46k in长度。
错误ORA-22835(缓冲区对于CLOB到CHAR或BLOB到RAW的转换太小),由于数据长度可变而无法执行此操作,因此无法执行此操作使用SUBSTR的数据可以在我的搜索字符串"中间分割。在数据中找到。
我正在寻找一种可以在SQL脚本中使用的直接而简单的解决方案。
以下是我与SQL Server一起使用的脚本示例:
DECLARE @replacestring NVarChar(MAX) = '0D0D000402175300008950.. very long string 46k+ in length ..1CA68848EEB58360000000049454E44AE426082'
DECLARE @oldFingerprintStart NVarChar(MAX) = '0D0D0004002BA80000FFD8FFE000104A46494600010201004800480000FFE10B304578696600004D4D002A0000000800070';
DECLARE @oldFingerprintEnd NVarChar(MAX) = '02800A002800A002800A002800A002800A002800A002800A002800A002800A002800A002800A002800A002800A002803FFD9';
UPDATE Table1
SET datacolumn =
CONCAT(
SUBSTRING(datacolumn, 0, CHARINDEX(@oldFingerprintStart, datacolumn)),
@replacestring,
SUBSTRING(datacolumn, CHARINDEX(@oldFingerprintEnd, datacolumn) + LEN(@oldFingerprintEnd), LEN(datacolumn) - (CHARINDEX(@oldFingerprintEnd, datacolumn) + LEN(@oldFingerprintEnd))+1)
)
WHERE CHARINDEX(@oldFingerprintStart, datacolumn) > 0
AND CHARINDEX(@oldFingerprintEnd, datacolumn) > 0
答案 0 :(得分:0)
您可以找到详细而详细的解释here,但就我的经验而言(以及Oracle documentation中所述),标准REPLACE
功能适用于NCLOB
字段同样的方式,就像在VARCHAR2
上一样。
UPDATE a_table
SET that_field = REPLACE(that_field, 'XYZ', 'ABC')
WHERE CONTAINS(that_field, 'XYZ') > 0
这样你就可以避免缓冲区溢出的任何麻烦,因为没有人可以处理。