Oracle
 sql >> Base de données >  >> RDS >> Oracle

Remplacement de texte dans une colonne BLOB

REPLACE fonctionne sur les types de données suivants :

search_string et replacement_string, ainsi que char, peuvent être n'importe lequel des types de données CHAR , VARCHAR2 , NCHAR , NVARCHAR2 , CLOB , ou NCLOB .

Vous avez choisi de stocker les données de caractères sous la forme d'une collection d'octets (BLOB). Ceux-ci ne peuvent pas être travaillés directement car un BLOB n'a pas de contexte et n'est qu'un très très grand nombre. Il ne peut pas être converti en caractères sans votre entrée :vous avez besoin de son jeu de caractères pour convertir des données binaires en texte.

Vous devrez soit coder la fonction REPLACE vous-même (en utilisant DBMS_LOB.instr par exemple) ou convertissez vos données en un CLOB exploitable et utilisez les fonctions standard sur le CLOB.

Je conseillerais fortement de changer le type de données de votre colonne. Cela empêchera toute autre erreur de conversion de jeu de caractères que vous rencontrerez probablement à l'avenir.

Si vous voulez vraiment travailler avec des blobs, utilisez des fonctions comme celles-ci :

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

Vous pouvez appeler ces fonctions directement depuis 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