您可以使用该dump()
函数以十进制或十六进制显示字符串中每个字符的数字表示,这样您就可以看到不可打印的字符:
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>
, or 删除它 - 正如您自己发现的那样 - 正则表达式。
...
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