UTL_FILE.get_line返回额外的字节ORACLE

时间:2013-02-18 23:26:42

标签: oracle

我需要使用UTL_FILE检查.csv文件的标题

我需要将标题行与数据库中的值进行比较。

UTL_FILE.get_line(file_handle, buffer);

例如

 dbms_output.put_line( length(buffer_db)); 20
 dbms_output.put_line( length(buffer)); 21

来自csv的varchar的长度比db的值长一个字节。我试过修剪它,什么都不做,两端没有空白区域。

如果我强制使用最大线条尺寸。

例如

UTL_FILE.get_line(file_handle, buffer, 20);

由于我必须检查多个不同的标题,我不能完全这样做。

我似乎无法弄清楚这个额外字节来自检索行的位置。

1 个答案:

答案 0 :(得分:3)

您可以使用the dump() function显示字符串中每个字符的数字表示形式,十进制或十六进制,以便您可以看到不可打印的字符:

select dump(<some string>) from dual;

您不能直接在dump调用中调用dbms_output - 它只能在SQL语句(PLS-00204)中使用 - 但您可以将其分配给另一个变量,然后显示:

declare
    ...
    buffer_dump varchar2(4000);
begin
    ...
    utl_file.get_line(file_handle, buffer);
    select dump(buffer) into buffer_dump from dual;
    dbms_output.put_line(buffer_dump);
    ...

由于您正在处理CSV文件,因此可能有理由猜测它具有Windows样式的行终止符(CRLF),并且get_line()在结果中包含回车符,这将被指示最后的额外字符由13表示(十进制ASCII)。

declare
    buffer varchar2(4000);
    buffer_dump varchar2(4000);
begin
    buffer := 'Field1,Field2^M'; -- terminated with \r
    select dump(buffer) into buffer_dump from dual;
    dbms_output.put_line(buffer_dump);
end;
/

Typ=1 Len=14: 70,105,101,108,100,49,44,70,105,101,108,100,50,13

如果是这种情况,您可以使用replace(<string>, chr(13), '')trim(trailing chr(13) from <string>删除它,或者 - 正如您自己发现的那样 - 删除正则表达式。

...
    buffer := trim(trailing chr(13) from buffer);
    select dump(buffer) into buffer_dump from dual;
    dbms_output.put_line(buffer_dump);
...

Typ=1 Len=13: 70,105,101,108,100,49,44,70,105,101,108,100,50