Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Zastępowanie tekstu w kolumnie BLOB

REPLACE działa na następujących typach danych:

Zarówno search_string i Replacement_string, jak również char, mogą być dowolnymi typami danych CHAR , VARCHAR2 , NCHAR , NVARCHAR2 , CLOB lub NCLOB .

Wybrałeś przechowywanie danych znakowych jako zbiór bajtów (BLOB). Nie można nad nimi pracować bezpośrednio, ponieważ BLOB nie ma kontekstu i jest tylko bardzo dużą liczbą. Nie można go przekonwertować na znaki bez Twojego wejście:potrzebujesz zestawu znaków do konwersji danych binarnych na tekst.

Będziesz musiał albo zakodować funkcję REPLACE siebie (za pomocą DBMS_LOB.instr na przykład) lub przekonwertuj swoje dane na działający CLOB i użyj standardowych funkcji w CLOB.

Radziłbym zdecydowanie zmienić typ danych swojej kolumny. Zapobiegnie to dalszym błędom konwersji zestawu znaków, które prawdopodobnie napotkasz w przyszłości.

Jeśli naprawdę chcesz pracować z obiektami blob, użyj funkcji takich jak:

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

Możesz wywołać te funkcje bezpośrednio z 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Co może spowodować zmianę Oracle ROWID?

  2. Nie daj się zwieść kałuży strumieni

  3. Jak wymusić przypadek pascala dzięki obsłudze Oracle Entity Framework?

  4. ORA-01017 Wskazówki dotyczące rozwiązywania błędów Oracle

  5. Oracle:Oblicz różnicę czasu w GG:MM:SS między 2 datami