Oracle
 sql >> Database >  >> RDS >> Oracle

Sostituzione del testo in una colonna BLOB

REPLACE funziona sui seguenti tipi di dati:

Sia search_string che replacement_string, così come char, possono essere qualsiasi tipo di dati CHAR , VARCHAR2 , NCHAR , NVARCHAR2 , CLOB o NCLOB .

Hai scelto di memorizzare i dati dei caratteri come una raccolta di byte (BLOB). Questi non possono essere elaborati direttamente perché un BLOB non ha contesto ed è solo un numero molto molto grande. Non può essere convertito in caratteri senza tuo input:è necessario il suo set di caratteri per convertire i dati binari in testo.

Dovrai codificare la funzione REPLACE te stesso (usando DBMS_LOB.instr per esempio) o converti i tuoi dati in un CLOB funzionante e usa le funzioni standard sul CLOB.

Consiglio vivamente di cambiare il tipo di dati della tua colonna. Ciò impedirà qualsiasi ulteriore errore di conversione del set di caratteri che probabilmente incontrerai in futuro.

Se vuoi davvero lavorare con i BLOB, usa funzioni come queste:

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

Puoi chiamare queste funzioni direttamente da SQL:

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