当我尝试在同一个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
我在这里缺少什么?
答案 0 :(得分:1)
您的v_in
和v_out
局部变量将作为dest_offset
程序的src_offset
和convertToBlob
参数传入。这些是in out
参数,因此可以通过调用修改它们。
dest_offset
,即您传递v_in
的内容,定义为
(IN)用于开始写入的目标LOB中的字节偏移量。 指定值1以从LOB的开头开始。
(OUT)写入结束后的新偏移量(以字节为单位)。
而src_offset
,即你传递的v_out
,被定义为
(IN)读取开始时源LOB中字符的偏移量。
(OUT)在结束后的源LOB中的字符偏移量 读取。
对于第一个电话,你在两种情况下都传入1。对于第二个调用,您将从第一个LOB传入偏移量。在进行第二次调用之前,您需要将两个参数重新初始化为1。
我还建议您为这些变量选择比v_in
和v_out
更好的变量名称。如果它们被命名为v_src_offset
和v_dest_offset
,那通常会使您的代码更加清晰,并且可能会让错误更容易被发现。