Oracle utl_file 和文件结束符

问题描述 投票:0回答:2

周一,我们的一项电子邮件作业开始出现问题。电子邮件正文使用 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..
oracle utl-file
2个回答
1
投票

0x15 是 NL(New Line),作为 EBCDIC 中结合换行和回车功能的字符...


0
投票

我要感谢保罗和杰夫对这个问题的想法。它最终是数据库端的配置问题。据我所知:

  • listener.ora 文件中创建了一个附加条目
  • 监听器是手动启动的,而不是使用正确的过程
  • 由于以上两个问题,出现了不匹配的情况。我猜oracle 正在尝试针对oracle 19 数据库使用oracle 12 utl_file。

我仍然不清楚为什么问题会出现,因为没有计划的补丁,也没有需要重新启动侦听器的中断。

它现在正在发挥作用,我想这才是重要的事情。

© www.soinside.com 2019 - 2024. All rights reserved.