Oracle - 更新 CLOB 列

问题描述 投票:0回答:1

我收到一个非常奇怪的错误,不确定它来自代码中的何处以及如何解决它:ORA-22920:包含 LOB 值的行未锁定

这是我的代码。我以前从未见过该消息。

CREATE OR REPLACE PROCEDURE update_clob (
  p_company_id       NUMBER,
  p_table_name       VARCHAR2,
  p_column_name      VARCHAR2,
  p_clob_content     CLOB) IS

v_clob_ref           CLOB;
v_amount             NUMBER;
v_offset             NUMBER;
v_length             NUMBER;
v_content            VARCHAR2(4000);
v_update             VARCHAR2(32000);
v_insert             VARCHAR2(32000);
v_select             VARCHAR2(32000);

BEGIN
  v_offset    := 1;
  v_amount    := 4000;
  v_length    := DBMS_LOB.GETLENGTH(p_clob_content);


  /*** Reset CLOB Column Value ***/
  v_update    := '
    UPDATE ' || p_table_name || '
    SET ' || p_column_name || ' = EMPTY_CLOB()
    WHERE company_id = ' || p_company_id ;

   EXECUTE IMMEDIATE v_update;

  /*** Loop through 4k chunks of CLOB ***/
  WHILE v_offset <= v_length LOOP
    v_select := '
      SELECT ' || p_column_name || '
      FROM ' || p_table_name || '
      WHERE company_id = ' || p_company_id;

    EXECUTE IMMEDIATE v_select INTO v_clob_ref;

    v_content := DBMS_LOB.SUBSTR(p_clob_content, v_amount, v_offset);
    DBMS_LOB.WRITEAPPEND(v_clob_ref, LENGTH(v_content), v_content);
    COMMIT;

    v_offset := v_offset + v_amount;
  END LOOP;

END update_clob;

非常感谢!

oracle clob
1个回答
0
投票

将 COMMIT 移至 END LOOP 之后:

    DBMS_LOB.WRITEAPPEND(v_clob_ref, LENGTH(v_content), v_content);

    v_offset := v_offset + v_amount;
  END LOOP;

  COMMIT;

END update_clob;

© www.soinside.com 2019 - 2024. All rights reserved.