Can';不要在循环中使用PLSQL ConvertToBlob

Can';不要在循环中使用PLSQL ConvertToBlob,plsql,blob,Plsql,Blob,我在尝试将CLOB从一个表转换为BLOB到另一个表时遇到问题。 基本上,我在PLSQL数组中循环,第一次调用DBMS\u LOB.convertToBlob总是很好,但是下一次迭代要么创建一个空blob,要么给我一个错误ORA-22275:指定的LOB定位器无效,这取决于我是在循环内部还是外部初始化blob 因此,如果我这样做: BEGIN FOR i IN 1 .. rs.COUNT LOOP DBMS_LOB.createTemporary (v_blob, TRUE); DBMS_LOB.

我在尝试将CLOB从一个表转换为BLOB到另一个表时遇到问题。 基本上,我在PLSQL数组中循环,第一次调用
DBMS\u LOB.convertToBlob
总是很好,但是下一次迭代要么创建一个空blob,要么给我一个错误
ORA-22275:指定的LOB定位器无效
,这取决于我是在循环内部还是外部初始化blob

因此,如果我这样做:

BEGIN
FOR i IN 1 .. rs.COUNT
LOOP
DBMS_LOB.createTemporary (v_blob, TRUE);
DBMS_LOB.convertToBlob (v_blob,
rs (i).v_clob,
DBMS_LOB.LOBMAXSIZE,
v_in,
v_out,
DBMS_LOB.DEFAULT_CSID,
v_lang,
v_warning);
[...]
DBMS_LOB.freeTemporary(v_blob);
它可以很好地转换第一个blob,但只返回其他blob的空blob

如果我这样做:

BEGIN
DBMS_LOB.CREATETEMPORARY (v_blob, TRUE);
FOR i IN 1 .. rs.COUNT
LOOP
DBMS_LOB.convertToBlob(...);
它还可以很好地转换第一个blob,但是在第一次迭代之后,我得到了
ORA-22275:invalid LOB locator specified
错误


我怎样才能避免这种情况?我似乎找不到很好的解释。谢谢你的帮助

必须是
NULL
值问题。
CLOB
不能为
NULL
。下面的代码给出了第三轮的错误

set serveroutput on
declare 
   TYPE rs_rec_type IS RECORD (
      v_clob clob
      );
  TYPE rs_rec_table_type IS TABLE OF rs_rec_type INDEX BY pls_integer;
  rs   rs_rec_table_type;
  v_blob    blob;
  v_in      integer := 1;
  v_out     integer := 1;
  v_lang    integer := 0;
  v_warning integer := 0;
BEGIN
  rs(1).v_clob := 'foo';
  rs(2).v_clob := 'bar';
  rs(3).v_clob := null;
  FOR i IN 1 .. rs.COUNT
  LOOP
      DBMS_LOB.createTemporary (v_blob, TRUE);
      dbms_output.put_line('i='||i);  
      DBMS_LOB.convertToBlob (v_blob,
                             rs (i).v_clob,
                             DBMS_LOB.LOBMAXSIZE,
                             v_in,
                             v_out,
                             DBMS_LOB.DEFAULT_CSID,
                             v_lang,
                             v_warning);
      dbms_output.put_line('done i='||i); 
      DBMS_LOB.freeTemporary(v_blob);     
  end loop;
end;
输出

Error report:
ORA-06502: PL/SQL: numeric or value error: invalid LOB locator specified: ORA-22275
ORA-06512: at "SYS.DBMS_LOB", line 991
ORA-06512: at line 20
06502. 00000 -  "PL/SQL: numeric or value error%s"
*Cause:    
*Action:
i=1
done i=1
i=2
done i=2
i=3

在循环中使用临时blob时,我遇到了类似的问题。 我通过每次初始化in、out、lang和warning参数来解决这个问题

詹姆斯。

这对我很有用:

declare
  cursor note is
    select id, rtf_clob
      from rtf_data
     where rtf_clob is not null
    for update of rtf_blob;
  l_blob        blob;
  l_amt         integer := dbms_lob.lobmaxsize;
  l_dest_offset integer := 1;
  l_src_offset  integer := 1;
  l_csid        integer := dbms_lob.default_csid;
  l_ctx         integer := dbms_lob.default_lang_ctx;
  l_warn        integer;

begin
  for note_rec in note loop
    l_blob        := null;
    l_amt         := dbms_lob.lobmaxsize;
    l_dest_offset := 1;
    l_src_offset  := 1;
    l_csid        := dbms_lob.default_csid;
    l_ctx         := dbms_lob.default_lang_ctx;
    l_warn        := null;
    dbms_lob.createTemporary(l_blob, true);
    dbms_lob.convertToBlob(l_blob,
                           note_rec.rtf_clob,
                           l_amt,
                           l_dest_offset,
                           l_src_offset,
                           l_csid,
                           l_ctx,
                           l_warn );

    update rtf_data
       set rtf_blob = l_blob
     where note_rec.id = id;

    dbms_lob.freeTemporary(l_blob); 
  end loop;
end;
/

如果不重新初始化循环中的变量,只有第一条记录创建了blob。

当CLOB包含NULL时,可能会发生此错误。
这意味着CLOB变量被传递给DBMS_LOB.convertToBlob

我也遇到了类似的问题,我想了一些关于
DBMS_LOB.convertToBlob
的事情。作为
dest_offset
src_offset
输入的变量在完成相关过程后会发生变化,因此每次迭代后都必须重置这些变量,以防创建多个文件

我不知道这是否能直接解决这个问题,但请记住,以备将来参考,以防在循环中使用
DBMS\u LOB.convertToBlob