Can';不要在循环中使用PLSQL ConvertToBlob
我在尝试将CLOB从一个表转换为BLOB到另一个表时遇到问题。 基本上,我在PLSQL数组中循环,第一次调用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.
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