Oracle - 键入以插入/更新 CLOB 列

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

我正在尝试重新初始化/更新 CLOB 列,并遇到一些我认为与 LOB LOCATOR 相关的问题,但需要一些帮助。

在第一个 UPDATE 语句之后,我得到:ORA-21560: argument 2 is null, invalid, or out of range

这是我的代码:

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

v_clob_ref           CLOB;
v_amount             NUMBER;
v_offset             NUMBER;
v_length             NUMBER;
v_update             VARCHAR2(1000);
v_select             VARCHAR2(1000);

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

  v_update    := '
    UPDATE ' || p_table_name || '
    SET ' || p_column_name || ' = EMPTY_CLOB()
    WHERE company_id = ' || p_company_id || '
    RETURNING ' || p_column_name || ' INTO :x';

  EXECUTE IMMEDIATE v_update USING OUT v_clob_ref;
  DBMS_LOB.WRITEAPPEND(v_clob_ref, v_length, DBMS_LOB.SUBSTR(p_clob_content, v_amount, v_offset));

  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;
    DBMS_LOB.WRITEAPPEND(v_clob_ref, v_length, DBMS_LOB.SUBSTR(p_clob_content, v_amount, v_offset));

    v_offset := v_offset + v_amount;
  END LOOP;
END update_clob;
oracle clob
1个回答
0
投票

这里您将整个 LOB 的长度分配给

v_length
:

 v_length    := DBMS_LOB.GETLENGTH(p_clob_content);

但是这里你要求 Oracle 写入那么多字节,但只提供 4000 字节的缓冲区:

 DBMS_LOB.WRITEAPPEND(v_clob_ref, v_length, DBMS_LOB.SUBSTR(p_clob_content, v_amount, v_offset));

尝试指定

v_amount
来代替:

 DBMS_LOB.WRITEAPPEND(v_clob_ref, v_amount, DBMS_LOB.SUBSTR(p_clob_content, v_amount, v_offset));
© www.soinside.com 2019 - 2024. All rights reserved.