小编典典

替换BLOB列中的文本

sql

在我们的一个表中,我们有一个HUGEBLOBColumn(列名是DYNAMIC_DATA),其中包含XML数据。我需要做的是从此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'

但我收到以下错误:

ORA-00932: inconsistent datatypes: expected NUMBER got BLOB

如何REPLACE在BLOB上执行?


阅读 355

收藏
2021-03-17

共1个答案

小编典典

REPLACE
适用于以下数据类型:

既search_string的和replacement_string,以及炭,可以是任何数据类型的CHARVARCHAR2NCHARNVARCHAR2CLOB,或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

您可以直接从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
2021-03-17