Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Ersetzen von Text in einer BLOB-Spalte

REPLACE funktioniert mit den folgenden Datentypen:

Sowohl Suchzeichenfolge als auch Ersatzzeichenfolge sowie Zeichen können alle Datentypen CHAR sein , VARCHAR2 , NCHAR , NVARCHAR2 , CLOB , oder NCLOB .

Sie haben sich entschieden, Zeichendaten als Sammlung von Bytes (BLOB) zu speichern. Diese können nicht direkt bearbeitet werden, da ein BLOB keinen Kontext hat und nur eine sehr sehr große Zahl ist. Es kann ohne Ihre nicht in Zeichen umgewandelt werden Eingabe:Sie benötigen ihren Zeichensatz, um Binärdaten in Text umzuwandeln.

Sie müssen entweder die Funktion REPLACE codieren selbst (unter Verwendung von DBMS_LOB.instr zum Beispiel) oder konvertieren Sie Ihre Daten in ein funktionierendes CLOB und verwenden Sie Standardfunktionen auf dem CLOB.

Ich würde dringend raten, den Datentyp Ihrer Spalte zu ändern. Dies wird jeden weiteren Zeichensatzkonvertierungsfehler verhindern, auf den Sie wahrscheinlich in Zukunft stoßen werden.

Wenn Sie wirklich mit Blobs arbeiten möchten, verwenden Sie Funktionen wie diese:

SQL> CREATE OR REPLACE FUNCTION convert_to_clob(l_blob BLOB) RETURN CLOB IS
  2     l_clob         CLOB;
  3     l_dest_offset  NUMBER := 1;
  4     l_src_offset   NUMBER := 1;
  5     l_lang_context NUMBER := dbms_lob.default_lang_ctx;
  6     l_warning      NUMBER;
  7  BEGIN
  8     dbms_lob.createtemporary(l_clob, TRUE);
  9     dbms_lob.converttoclob(dest_lob     => l_clob,
 10                            src_blob     => l_blob,
 11                            amount       => dbms_lob.lobmaxsize,
 12                            dest_offset  => l_dest_offset,
 13                            src_offset   => l_src_offset,
 14                            blob_csid    => nls_charset_id('AL32UTF8'),
 15                            lang_context => l_lang_context,
 16                            warning      => l_warning);
 17     RETURN l_clob;
 18  END convert_to_clob;
 19  /

Function created

SQL> CREATE OR REPLACE FUNCTION convert_to_blob(l_clob CLOB) RETURN BLOB IS
  2     l_blob         BLOB;
  3     l_dest_offset  NUMBER := 1;
  4     l_src_offset   NUMBER := 1;
  5     l_lang_context NUMBER := dbms_lob.default_lang_ctx;
  6     l_warning      NUMBER;
  7  BEGIN
  8     dbms_lob.createtemporary(l_blob, TRUE);
  9     dbms_lob.converttoblob(dest_lob     => l_blob,
 10                            src_clob     => l_clob,
 11                            amount       => dbms_lob.lobmaxsize,
 12                            dest_offset  => l_dest_offset,
 13                            src_offset   => l_src_offset,
 14                            blob_csid    => nls_charset_id('AL32UTF8'),
 15                            lang_context => l_lang_context,
 16                            warning      => l_warning);
 17     RETURN l_blob;
 18  END convert_to_blob;
 19  /

Function created

Sie können diese Funktionen direkt aus SQL heraus aufrufen:

SQL> UPDATE ape1_item_version
  2     SET DYNAMIC_DATA = convert_to_blob(
  3                          REPLACE(convert_to_clob(DYNAMIC_DATA),
  4                                 'Single period',
  5                                 'Single period period set1')
  6                          )
  7   WHERE NAME = 'PRIT ALL POOL for Duration Telephony 10_NA_G_V_H_N_Z2';

1 row updated