如果在Oracle SQL中将数据写入UTL_文件后未关闭该文件,则会导致数据不一致
我使用Oracle SQL developer作为Oracle 11g DB的客户端。这是一个简单的问题。我正在从表中提取数据并将数据写入文本文件。这段特定的代码被安排为每月一次的作业,输出文本文件被放置在DB目录路径中 每个月记录的数量不同。在上个月的作业之前,文本输出文件的行数与表中相同。本月,在文本文件中观察到数据不一致。要导出到文本文件的行数是1000。输出文件总共有950行左右。数据不匹配。这个问题直到上个月才发生。 在进一步测试时,观察到,在使用UTL_file.FCLOSE(M_OUT_SYS)写入后,文件没有关闭。问题在关闭文件后得到解决,现在数据匹配 但是为什么这个问题直到上个月才出现,程序运行时没有关闭文件,为什么这个问题在这个月突然出现?如果在Oracle SQL中将数据写入UTL_文件后未关闭该文件,则会导致数据不一致,oracle,utl-file,Oracle,Utl File,我使用Oracle SQL developer作为Oracle 11g DB的客户端。这是一个简单的问题。我正在从表中提取数据并将数据写入文本文件。这段特定的代码被安排为每月一次的作业,输出文本文件被放置在DB目录路径中 每个月记录的数量不同。在上个月的作业之前,文本输出文件的行数与表中相同。本月,在文本文件中观察到数据不一致。要导出到文本文件的行数是1000。输出文件总共有950行左右。数据不匹配。这个问题直到上个月才发生。 在进一步测试时,观察到,在使用UTL_file.FCLOSE(M_O
declare
M_OUT_SYS UTL_FILE.FILE_TYPE;
M_DATA VARCHAR2(2000);
M_DIRECTORY_NAME ALL_DIRECTORIES.DIRECTORY_NAME%TYPE;
M_DELIMITER_FILE_NAME VARCHAR2(250);
cursor c1 is
select * from example_table;
begin
M_DIRECTORY_NAME := 'OracleDB_dir_name';
M_DELIMITER_FILE_NAME := 'OutputTextFile.txt';
M_OUT_SYS := UTL_FILE.FOPEN(M_DIRECTORY_NAME,
M_DELIMITER_FILE_NAME,
'W', 8192);
UTL_FILE.PUT_LINE(M_OUT_SYS,'column1|column2|column3');
for i in c1 loop
M_DATA := I.column1 || '|' || I.column2 || '|' || I.column3;
UTL_FILE.PUT_LINE(M_OUT_SYS, M_DATA);
end loop;
end;
参见11.2的utl_文件文档: UTL_FILE.PUT_行(默认情况下)不会在每次调用后刷新到文件,它只是写入缓冲区。 冲洗将在以下任一情况下进行:
我的钱会花在你以前的工作上。当你来取文件时,他们已经退出了会议。当您注意到差异时,是因为会话仍处于打开状态,并且上次触发了第950行的自动刷新。简短回答:发生了一些变化。我猜这不是程序的代码,否则你不会问的。这就离开了数据库。也许应用了一个修补程序,弥补了代码所依赖的漏洞。我从1981年开始从事这一行业,相信我,当时的环境中充斥着被补丁或升级破坏的代码——因为它依赖于未记录和不正确的行为。最后,这并不重要。您的过程应该关闭该文件,所以只需修复它。