Oracle10g 将当前CLOB列复制到Oracle中的新BLOB列

Oracle10g 将当前CLOB列复制到Oracle中的新BLOB列,oracle10g,Oracle10g,我有一个带有CLOB列的表。我想将现有数据转换为BLOB数据类型。由于数据类型的无效更改,ORA-252858失败 我想创建一个新的BLOB列,将现有数据复制到其中,然后删除现有的CLOB列 如何从CLOB列复制到BLOB列 create table temp(col_clob clob,col_blob blob); insert into temp (col_clob) values('hi i am gaurav soni'); insert into temp (col_clob) v

我有一个带有
CLOB
列的表。我想将现有数据转换为
BLOB
数据类型。由于数据类型的无效更改,ORA-252858失败

我想创建一个新的
BLOB
列,将现有数据复制到其中,然后删除现有的
CLOB

如何从
CLOB
列复制到
BLOB

create table temp(col_clob clob,col_blob blob);

insert into temp (col_clob) values('hi i am gaurav soni');
insert into temp (col_clob) values('hi i am gaurav soni');
insert into temp (col_clob) values('hi i am gaurav soni');
insert into temp (col_clob) values('hi i am gaurav soni');
insert into temp (col_clob) values('hi i am gaurav soni');
/您需要创建一个将clob转换为blob的函数,如下所示: 坦率地说,我从另一个来源获取了这个函数,但是你会感到困惑,因为在那个论坛上有一个讨论,这就是为什么我在这里没有提到/

输出

 COL_CLOB                               COL_BLOB           
-------------------------------------- -------------------
hi i am gaurav soni                    hi i am gaurav soni
hi i am gaurav soni                    hi i am gaurav soni
hi i am gaurav soni                    hi i am gaurav soni
hi i am gaurav soni                    hi i am gaurav soni
hi i am gaurav soni                    hi i am gaurav soni

我的信息来自

在此处复制代码以避免死链接:

CREATE OR REPLACE FUNCTION clob_to_blob(p_clob IN CLOB) RETURN BLOB IS
  v_blob BLOB;
  v_offset NUMBER DEFAULT 1;
  v_amount NUMBER DEFAULT 4096;
  v_offsetwrite NUMBER DEFAULT 1;
  v_amountwrite NUMBER;
  v_buffer VARCHAR2(4096 CHAR);
BEGIN
  dbms_lob.createtemporary(v_blob, TRUE);

  Begin
    LOOP
      dbms_lob.READ (lob_loc => p_clob,
                     amount  => v_amount,
                     offset  => v_offset,
                     buffer  => v_buffer);

      v_amountwrite := utl_raw.length (r => utl_raw.cast_to_raw(c => v_buffer));

      dbms_lob.WRITE (lob_loc => v_blob,
                      amount  => v_amountwrite,
                      offset  => v_offsetwrite,
                      buffer  => utl_raw.cast_to_raw(v_buffer));

      v_offsetwrite := v_offsetwrite + v_amountwrite;

      v_offset := v_offset + v_amount;
      v_amount := 4096;
    END LOOP;
  EXCEPTION
    WHEN no_data_found THEN
      NULL;
  End;
  RETURN v_blob;
END clob_to_blob;

这对我来说是有效的,即使dbms_lob.converttoclob没有。谢谢你的回答。警告应该是一个指示转换错误的
out
参数。它不应该预先设置为错误。另外,我所有更新的BLOB似乎都设置为null。@ipavlic:你能发布你的clob数据吗,我指的是任何数据record@ipavlic:对于out参数,您需要自行处理,这取决于您更新记录的方式以及更新警告消息的位置。对于数据,否,我不能。它是一个简单的xml文件。至于参数:在我看来,您提前将其定义为一个错误。如果未在函数中更改它,它将保持错误状态。我错过什么了吗?
CREATE OR REPLACE FUNCTION clob_to_blob(p_clob IN CLOB) RETURN BLOB IS
  v_blob BLOB;
  v_offset NUMBER DEFAULT 1;
  v_amount NUMBER DEFAULT 4096;
  v_offsetwrite NUMBER DEFAULT 1;
  v_amountwrite NUMBER;
  v_buffer VARCHAR2(4096 CHAR);
BEGIN
  dbms_lob.createtemporary(v_blob, TRUE);

  Begin
    LOOP
      dbms_lob.READ (lob_loc => p_clob,
                     amount  => v_amount,
                     offset  => v_offset,
                     buffer  => v_buffer);

      v_amountwrite := utl_raw.length (r => utl_raw.cast_to_raw(c => v_buffer));

      dbms_lob.WRITE (lob_loc => v_blob,
                      amount  => v_amountwrite,
                      offset  => v_offsetwrite,
                      buffer  => utl_raw.cast_to_raw(v_buffer));

      v_offsetwrite := v_offsetwrite + v_amountwrite;

      v_offset := v_offset + v_amount;
      v_amount := 4096;
    END LOOP;
  EXCEPTION
    WHEN no_data_found THEN
      NULL;
  End;
  RETURN v_blob;
END clob_to_blob;