周一,我们的一项电子邮件作业开始出现问题。电子邮件正文使用 utl_file 生成并使用 mailx 发送。电子邮件开始包含包含正文的 .bin 附件。
经过研究,我发现由于某种原因 utl_file 开始使用十六进制 15 作为文件结尾字符而不是 0A 来生成文件。
我通过从文件末尾删除 HEX 15 字符来实现解决方法,但这让我很困惑为什么会发生这种情况。
14号生成的文件看起来不错,15号就开始出现问题。我们的数据库团队表示周末没有进行任何更改,并且我没有看到在运行作业的服务器上进行任何更改。
Oracle 版本为“Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production 版本 19.20.0.0.0"
我尝试从旧的 Solaris 服务器和 SLES 12 运行测试脚本,得到相同的结果。
我创建了一个简单的程序来测试。
create or replace PROCEDURE test_nl_email_issue (FNAME in varchar2) IS
pathnm varchar2(30) := 'NL_UTL';
com_id UTL_FILE.FILE_TYPE;
BEGIN
com_id := UTL_FILE.FOPEN(pathnm,'test_' || FNAME || '.txt','w');
IF UTL_FILE.IS_OPEN(com_id) THEN
UTL_FILE.PUT_LINE(com_id,'Line 1');
UTL_FILE.PUT(com_id,'Test Message New');
UTL_FILE.FFLUSH(com_id);
UTL_FILE.FCLOSE(com_id);
END IF;
END;
如果我使用 sql Developer 从 Windows 计算机运行此命令,生成的文件看起来不错。它以换行符 (0A) 结尾并正常发送。
00000000: 4c69 6e65 2031 0a54 6573 7420 4d65 7373 Line 1.Test Mess
00000010: 6167 6520 4e65 770a age New.
如果我从我的 Linux 机器运行此命令,生成的文件将以十六进制 15 字符结尾。
00000000: 4c69 6e65 2031 0a54 6573 7420 4d65 7373 Line 1.Test Mess
00000010: 6167 6520 4e65 7715 age New.
如果我将测试过程中的最终 put 更改为 put_line,则会添加 0A 和 15。
00000000: 4c69 6e65 2031 0a54 6573 7420 4d65 7373 Line 1.Test Mess
00000010: 6167 6520 4e65 770a 15 age New..
0x15 是 NL(New Line),作为 EBCDIC 中结合换行和回车功能的字符...
我要感谢保罗和杰夫对这个问题的想法。它最终是数据库端的配置问题。据我所知:
我仍然不清楚为什么问题会出现,因为没有计划的补丁,也没有需要重新启动侦听器的中断。
它现在正在发挥作用,我想这才是重要的事情。