当我尝试在同一个PLSQL块中多次使用DBMS_LOB.convertToBlob过程时,只有第一个执行像预期的那样工作。所有其他的处决都会产生空白点。下面是一个示例:
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我在这里错过了什么?
发布于 2015-08-09 08:02:22
您的v_in和v_out局部变量将作为convertToBlob过程的dest_offset和src_offset参数传入。这些是in out参数,因此它们被调用修改。
dest_offset,也就是您要传递v_in的内容,被定义为
( in )在写入开始时,目标LOB中的字节偏移量。指定一个从LOB开头开始的值1。 (OUT)写入结束后的新偏移量(以字节计)。
而src_offset,也就是您要传递的v_out,则被定义为
( in )在读取开始时在源LOB中的字符中偏移。 (OUT)读取结束后源LOB中字符的偏移量。
对于第一个电话,在这两种情况下,您都要传递1。对于第二个调用,您将从第一个LOB传入偏移量。在进行第二次调用之前,需要将这两个参数重新初始化为1。
我还建议您为这些变量选择比v_in和v_out更好的变量名。如果它们被命名为v_src_offset和v_dest_offset,这通常会使您的代码更清晰,并可能使错误更容易识别。
https://stackoverflow.com/questions/31902029
复制相似问题