我正在尝试跨Oracle中的数据库链接复制7毫米行表。
该表具有几列CLOB类型。 我已经尝试使用INSERT / * + Append * /进行NOLOGGING,但是它仍然太慢了。 我使用BULK COLLECT和FORALL取得了更好的性能,但是不断收到Oracle错误ORA-22922:不存在的LOB值
CREATE OR REPLACE PROCEDURE copy_c AS
TYPE abc_rectype IS RECORD
(a_id NUMBER,
b_id NUMBER,
c_id NUMBER,
case_abc_addl CLOB,
s_comments CLOB,
case_abc CLOB);
TYPE abc_tbltype IS TABLE OF abc_rectype;
l_abc_info abc_tbltype;
CURSOR rmt_cur IS
SELECT cs.a_id,
cs.b_id,
cs.c_id,
cs.case_abc_addl,
cs.s_comments,
cs.case_abc
FROM schema.c_tbl@dblink cs
WHERE (cs.b_id, cs.c_id) IN
(SELECT t.b_id, t.c_id
FROM temp_z t);
l_limit NUMBER := 1000;
BEGIN
-- First get the data into memory
OPEN rmt_cur;
LOOP
BEGIN
FETCH rmt_cur
BULK COLLECT INTO l_abc_info LIMIT l_limit;
-- Now insert these records into a local abcs table
FORALL i IN 1..l_abc_info.count
INSERT INTO z_tbl_temp
(a_id,
b_id,
c_id,
case_abc_addl,
s_comments,
case_abc)
VALUES
(l_abc_info(i).a_id,
l_abc_info(i).b_id,
l_abc_info(i).c_id,
l_abc_info(i).case_abc_addl,
l_abc_info(i).s_comments,
l_abc_info(i).case_abc);
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
END;
COMMIT;
EXIT WHEN l_abc_info.COUNT < l_limit;
END LOOP;
CLOSE rmt_cur;
EXCEPTION
WHEN OTHERS THEN
IF rmt_cur%ISOPEN THEN
CLOSE rmt_cur;
END IF;
dbms_output.put_line(SQLERRM);
END copy_c;
我以为我至少可以用BEGIN-END块捕获该异常,但是过程只是停止了。 谢谢你的帮助!