【问题标题】:Oracle DBMS_LOB: Using DBMS_LOB.convertToBlob multiple times in PLSQL blockOracle DBMS_LOB:在 PLSQL 块中多次使用 DBMS_LOB.convertToBlob
【发布时间】:2015-11-01 07:59:16
【问题描述】:

当我尝试在同一个 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

我在这里错过了什么?

【问题讨论】:

    标签: oracle plsql oracle11g blob


    【解决方案1】:

    您的v_inv_out 局部变量作为convertToBlob 过程的dest_offsetsrc_offset 参数传入。这些是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,那通常会使您的代码更清晰,并且可能更容易发现错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-12
      • 1970-01-01
      • 1970-01-01
      • 2022-07-26
      相关资源
      最近更新 更多