0

Oracle 11g データベースとテーブル内の NCLOB 列を使用して、テキストを別のテキストに置き換えようとしています。大まかに言えば、それは非常に単純です。私は SQL Server バージョンの SQL スクリプトで成功しましたが、Oracle では、主に NCLOB 列のデータの長さが 46k を簡単に超える可能性があるため、複雑になっています。

エラー 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
4

1 に答える 1