【发布时间】:2019-11-03 00:12:45
【问题描述】:
我有一个包含超过 200,000 行的巨大 CSV 文件。每行都有一个评论 ID、酒店 ID、评论日期和评论本身。评论栏引起了问题。有些评论很长,超过 2000 字节,因此会导致错误:
ORA-20000:ORU-10027:缓冲区溢出,限制为 20000 字节。
我能做些什么来解决这个问题吗?这是我当前的代码:
DECLARE
F UTL_FILE.FILE_TYPE;
v_Line VARCHAR2(2000);
v_ReviewID NUMBER;
v_HotelID VARCHAR2(2000);
v_ReviewDate VARCHAR(2000);
v_ReviewName CLOB;
v_Review CLOB;
BEGIN
F := UTL_FILE.FOPEN ('REVIEW_READ', 'Review.csv', 'R', 30000);
IF UTL_FILE.IS_OPEN(F) THEN
LOOP
BEGIN
DBMS_OUTPUT.PUT_LINE('Start');
UTL_FILE.GET_LINE(F, v_Line);
v_ReviewID := REGEXP_SUBSTR(v_Line, '[^,]+', 1, 1);
v_HotelID := REGEXP_SUBSTR(v_Line, '[^,]+', 1, 2);
v_ReviewDate := REGEXP_SUBSTR(v_Line, '[^,]+', 1, 3);
v_ReviewName := REGEXP_SUBSTR(v_Line, '[^,]+', 1, 4);
v_Review := REGEXP_SUBSTR(v_Line, '[^,]+', 1, 5);
INSERT INTO Review
VALUES(v_ReviewID, v_HotelID, v_ReviewDate, v_ReviewName, v_Review);
DBMS_OUTPUT.PUT_LINE(v_Line);
IF v_Line IS NULL THEN
EXIT;
END IF;
COMMIT;
EXCEPTION
WHEN NO_DATA_FOUND THEN
EXIT;
END;
END LOOP;
END IF;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
UTL_FILE.FCLOSE(F);
END;
【问题讨论】:
-
请提及您正在使用的数据库软件:Oracle?
-
是的,我正在使用 Oracal
-
将评论文本的数据类型更改为
CLOB。 -
我进行了上述编辑,但我仍然恢复了以下错误:ORA-20000:ORU-10027:缓冲区溢出,限制为 20000 字节。评论长短不一,有些真的很大。有没有办法读取其中的一部分然后解析它然后读取其余部分?
-
@NathanC 我已将此错误消息添加到您的问题中。我认为这是您遇到的主要问题,因为您提到了“缓冲区溢出错误”,但如果 VARCHAR2 变量或表的列对于您要加载的内容来说不够大,也可能会出现问题。在声明列时使用
tablename.columnname%type语法也是一个好主意,这样您就知道一切都是同步的。