0

我正在尝试使用 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;
4

0 回答 0