sql >> Databasteknik >  >> RDS >> Oracle

Ersätter text i en BLOB-kolumn

REPLACE fungerar på följande datatyper:

Både search_string och replacement_string, såväl som char, kan vara vilken som helst av datatyperna CHAR , VARCHAR2 , NCHAR , NVARCHAR2 , CLOB , eller NCLOB .

Du har valt att lagra teckendata som en samling byte (BLOB). Dessa kan inte bearbetas direkt eftersom en BLOB inte har något sammanhang och bara är ett väldigt mycket stort antal. Det kan inte konverteras till tecken utan din input:du behöver dess teckenuppsättning för att konvertera binär data till text.

Du måste antingen koda funktionen REPLACE dig själv (med DBMS_LOB.instr till exempel) eller konvertera dina data till en fungerande CLOB och använd standardfunktioner på CLOB.

Jag rekommenderar starkt att du ändrar datatypen för din kolumn. Detta kommer att förhindra ytterligare teckenuppsättningskonverteringsfel som du sannolikt kommer att stöta på i framtiden.

Om du verkligen vill arbeta med blobbar, använd funktioner som dessa:

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 anropa dessa funktioner direkt från 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. den bifogade databasen är skrivskyddad

  2. Databas som kan hantera>500 miljoner rader

  3. Hur man filtrerar in ett till många förhållande med android room db

  4. indatafilen verkar vara en textformatdump. Använd psql