sql >> Database >  >> RDS >> Oracle

Tekst in een BLOB-kolom vervangen

REPLACE werkt op de volgende datatypes:

Zowel search_string en replacement_string, evenals char, kunnen elk van de gegevenstypen zijn CHAR , VARCHAR2 , NCHAR , NVARCHAR2 , CLOB , of NCLOB .

U heeft ervoor gekozen om tekengegevens op te slaan als een verzameling bytes (BLOB). Hier kan niet direct aan gewerkt worden omdat een BLOB geen context heeft en maar een heel erg groot aantal is. Het kan niet worden geconverteerd naar tekens zonder uw invoer:je hebt de tekenset nodig om binaire gegevens naar tekst te converteren.

Je moet ofwel de functie coderen REPLACE jezelf (met behulp van DBMS_LOB.instr bijvoorbeeld) of converteer uw gegevens naar een werkbare CLOB en gebruik standaardfuncties op de CLOB.

Ik zou sterk adviseren om het datatype van uw kolom te wijzigen. Dit voorkomt verdere conversiefouten in de tekenset die u in de toekomst waarschijnlijk zult tegenkomen.

Als je echt met blobs wilt werken, gebruik dan functies als deze:

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

U kunt deze functies rechtstreeks vanuit SQL aanroepen:

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


  1. date_trunc 5 minuten interval in PostgreSQL

  2. Postgresql intarray-fout:undefined symbool:pfree

  3. pyspark gebruiken om verbinding te maken met PostgreSQL

  4. Indexen in MySQL begrijpen:deel drie