我正在尝试使用UTL_FILE将带有标题的csv文件上传到表中,但我遇到了一个问题。使用utl_file进行正常上传时,还会包含标题,并将数据结果记录在双引号中(我不需要)。如果我使用if
条件排除标题,如下面的代码和声明标题变量,它会上传没有标题的记录,但仍然是双引号。当我从csv文件手动删除标题时,它上传没有引号。但是每天都会新创建csv,因此无法从文件中删除标题。
请建议一些与目标表和csv之间的标题匹配的解决方案,然后上传csv文件数据。以下是我的程序。
create or replace procedure load_file_new(p_FileDir in varchar2, p_FileName in varchar2)
as
v_FileHandle utl_file.file_type;
v_NewLine varchar2(2000);
v_a varchar2(100);
v_b varchar2(100);
v_c varchar2(100);
v_d varchar2(100);
p_ignore_headerlines number;
begin
v_FileHandle := utl_file.fopen(p_FileDir, p_FileName, 'r', 32767);
p_ignore_headerlines := 1;
if p_ignore_headerlines > 0
then
begin
for i in 1 .. p_ignore_headerlines
loop
utl_file.get_line(v_FileHandle, v_NewLine);
end loop;
end;
end if;
loop
begin
utl_file.get_line(v_FileHandle, v_NewLine);
exception
when no_data_found then
exit;
end;
v_a := regexp_substr(v_NewLine, '("[^"]*"|[^,]+)', 1, 1);
v_b := regexp_substr(v_NewLine, '("[^"]*"|[^,]+)', 1, 2);
v_c := regexp_substr(v_NewLine, '("[^"]*"|[^,]+)', 1, 3);
v_d := regexp_substr(v_NewLine, '("[^"]*"|[^,]+)', 1, 4);
merge into test using dual on (a = v_a)
when not matched then insert (a, b, c, d)
values (v_a, v_b, v_c, v_d)
when matched then update set
b = v_b, c = v_c, d = v_d where a = v_a;
end loop;
utl_file.fclose(v_FileHandle);
commit;
end load_file_new;