Alo*_*ler 2 sql oracle replace blob
在我们的一个表中,我们有一个包含XML数据的HUGEBLOB列(列名称DYNAMIC_DATA).我需要做的是用这个BLOB更新文本的某个部分.
我试过这个查询:
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'
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
ORA-00932: inconsistent datatypes: expected NUMBER got BLOB
如何REPLACE在BLOB上执行?
REPLACE 适用于以下数据类型:
既search_string的和replacement_string,以及炭,可以是任何数据类型的
CHAR,VARCHAR2,NCHAR,NVARCHAR2,CLOB,或NCLOB.
您已选择将字符数据存储为字节集合(BLOB).这些不能直接处理,因为BLOB没有上下文,只是一个非常大的数字.它不能被转换为字符未经您的输入:你需要的字符集,以二进制数据转换为文本.
您必须REPLACE自己编写函数(DBMS_LOB.instr例如使用)或将数据转换为可用的CLOB并使用CLOB上的标准函数.
我强烈建议您更改列的数据类型.这将防止您将来可能遇到的任何进一步的字符集转换错误.
如果您真的想使用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
Run Code Online (Sandbox Code Playgroud)
您可以直接从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
Run Code Online (Sandbox Code Playgroud)
小智 5
如果 blob 对象是文本,我们也可以在 Oracle 11 及更高版本中使用类似下面的查询。
`UPDATE table_name
SET text_blob_column-name = UTL_RAW.CAST_TO_RAW(
REPLACE(UTL_RAW.CAST_TO_VARCHAR2(text_blob_column-name),
'<existing value>',
'<value to update>')
)
WHERE where_clause_Column-name='171';`
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
28280 次 |
| 最近记录: |