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
, ouNCLOB
.
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