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

Erstatning af tekst i en BLOB-kolonne

REPLACE virker på følgende datatyper:

Både search_string og replacement_string, såvel som char, kan være enhver af datatyperne CHAR , VARCHAR2 , NCHAR , NVARCHAR2 , CLOB eller NCLOB .

Du har valgt at gemme tegndata som en samling af bytes (BLOB). Disse kan ikke arbejdes direkte på, fordi en BLOB ikke har nogen kontekst og kun er et meget meget stort tal. Det kan ikke konverteres til tegn uden din input:du skal bruge dets tegnsæt for at konvertere binære data til tekst.

Du skal enten kode funktionen REPLACE dig selv (ved hjælp af DBMS_LOB.instr for eksempel) eller konverter dine data til en brugbar CLOB og brug standardfunktioner på CLOB.

Jeg vil kraftigt råde dig til at ændre datatypen for din kolonne. Dette vil forhindre yderligere tegnsætkonverteringsfejl, som du sandsynligvis vil støde på i fremtiden.

Hvis du virkelig vil arbejde med klatter, så brug funktioner som disse:

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

Du kan kalde disse funktioner direkte fra 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


  1. Django JSONField-filtrering

  2. Hvornår skal man bruge MyISAM og InnoDB?

  3. MySQL:Giv **alle** privilegier på databasen

  4. Oracle SQL Where-klausul for at finde datoposter, der er ældre end 30 dage