在我们的一个表中,我们有一个HUGEBLOBColumn(列名是DYNAMIC_DATA),其中包含XML数据。我需要做的是从此BLOB中更新文本的特定部分。
HUGEBLOB
DYNAMIC_DATA
我已经尝试过以下查询:
UPDATE ape1_item_version SET DYNAMIC_DATA = REPLACE (DYNAMIC_DATA,'Single period','Single period period set1') WHERE name = 'PRIT ALL POOL for Duration Telephony 10_NA_G_V_H_N_Z2'
但我收到以下错误:
ORA-00932: inconsistent datatypes: expected NUMBER got BLOB
如何REPLACE在BLOB上执行?
REPLACE
REPLACE 适用于以下数据类型:
既search_string的和replacement_string,以及炭,可以是任何数据类型的CHAR,VARCHAR2,NCHAR,NVARCHAR2,CLOB,或NCLOB。
CHAR
VARCHAR2
NCHAR
NVARCHAR2
CLOB
NCLOB
您已选择将字符数据存储为字节集合(BLOB)。这些不能直接处理,因为BLOB没有上下文,并且只是一个非常大的数字。它不能被转换为字符未经 您的 输入:你需要的字符集,以二进制数据转换为文本。
您将必须REPLACE自己编写函数功能(DBMS_LOB.instr例如使用),或者将数据转换为可用的CLOB,然后在CLOB上使用标准函数。
DBMS_LOB.instr
我强烈建议您更改列的数据类型。这将防止您将来可能遇到的任何进一步的字符集转换错误。
如果您真的想使用Blob,请使用以下函数:
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
您可以直接从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