我正在尝试重新初始化/更新 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;
这里您将整个 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));