Oracle DBMS_LOB:在PLSQL块中多次使用DBMS_LOB.convertToBlob

时间:2015-08-09 07:43:55

标签: oracle plsql oracle11g blob

当我尝试在同一个PLSQL块中多次使用DBMS_LOB.convertToBlob过程时,只有第一次执行按预期工作。所有其他执行都会产生空blob。这是一个例子:

DECLARE 

v_temp1 varchar2(32767) := 'absd'; 
V_temp1_blob BLOB; 
V_temp2 varchar2(32767) := 'efghi'; 
V_temp2_blob BLOB;

v_in      integer := 1;
v_out     integer := 1;
v_lang    integer := 0;
v_warning integer := 0;

BEGIN

DBMS_LOB.createTemporary (V_temp1_blob, TRUE);  
DBMS_LOB.convertToBlob(V_temp1_blob, V_temp1, DBMS_LOB.LOBMAXSIZE, v_in, v_out, DBMS_LOB.DEFAULT_CSID, v_lang, v_warning);
dbms_output.put_line('V_temp1_blob: ' || dbms_lob.getlength(V_temp1_blob));

DBMS_LOB.createTemporary (V_temp2_blob, TRUE);
DBMS_LOB.convertToBlob(V_temp2_blob, V_temp2, DBMS_LOB.LOBMAXSIZE, v_in, v_out, DBMS_LOB.DEFAULT_CSID, v_lang, v_warning);
dbms_output.put_line('V_temp2_blob: ' || dbms_lob.getlength(V_temp2_blob));

END;

输出:

V_temp1_blob: 4
V_temp2_blob: 0

我的预期输出是:

V_temp1_blob: 4
V_temp2_blob: 5

我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

您的v_inv_out局部变量将作为dest_offset程序的src_offsetconvertToBlob参数传入。这些是in out参数,因此可以通过调用修改它们。

dest_offset,即您传递v_in的内容,定义为

  

(IN)用于开始写入的目标LOB中的字节偏移量。   指定值1以从LOB的开头开始。

     

(OUT)写入结束后的新偏移量(以字节为单位)。

src_offset,即你传递的v_out,被定义为

  

(IN)读取开始时源LOB中字符的偏移量。

     

(OUT)在结束后的源LOB中的字符偏移量   读取。

对于第一个电话,你在两种情况下都传入1。对于第二个调用,您将从第一个LOB传入偏移量。在进行第二次调用之前,您需要将两个参数重新初始化为1。

我还建议您为这些变量选择比v_inv_out更好的变量名称。如果它们被命名为v_src_offsetv_dest_offset,那通常会使您的代码更加清晰,并且可能会让错误更容易被发现。