Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果在Oracle SQL中将数据写入UTL_文件后未关闭该文件,则会导致数据不一致_Oracle_Utl File - Fatal编程技术网

如果在Oracle SQL中将数据写入UTL_文件后未关闭该文件,则会导致数据不一致

如果在Oracle SQL中将数据写入UTL_文件后未关闭该文件,则会导致数据不一致,oracle,utl-file,Oracle,Utl File,我使用Oracle SQL developer作为Oracle 11g DB的客户端。这是一个简单的问题。我正在从表中提取数据并将数据写入文本文件。这段特定的代码被安排为每月一次的作业,输出文本文件被放置在DB目录路径中 每个月记录的数量不同。在上个月的作业之前,文本输出文件的行数与表中相同。本月,在文本文件中观察到数据不一致。要导出到文本文件的行数是1000。输出文件总共有950行左右。数据不匹配。这个问题直到上个月才发生。 在进一步测试时,观察到,在使用UTL_file.FCLOSE(M_O

我使用Oracle SQL developer作为Oracle 11g DB的客户端。这是一个简单的问题。我正在从表中提取数据并将数据写入文本文件。这段特定的代码被安排为每月一次的作业,输出文本文件被放置在DB目录路径中

每个月记录的数量不同。在上个月的作业之前,文本输出文件的行数与表中相同。本月,在文本文件中观察到数据不一致。要导出到文本文件的行数是1000。输出文件总共有950行左右。数据不匹配。这个问题直到上个月才发生。 在进一步测试时,观察到,在使用UTL_file.FCLOSE(M_OUT_SYS)写入后,文件没有关闭。问题在关闭文件后得到解决,现在数据匹配

但是为什么这个问题直到上个月才出现,程序运行时没有关闭文件,为什么这个问题在这个月突然出现?

    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_行(默认情况下)不会在每次调用后刷新到文件,它只是写入缓冲区。 冲洗将在以下任一情况下进行:

  • 实例由于达到某个缓冲区大小(约10KB)而决定刷新
  • 使用utl_file.fflush手动刷新数据
  • 文件句柄已关闭
  • 会话断开连接(类似于3)

  • 我的钱会花在你以前的工作上。当你来取文件时,他们已经退出了会议。当您注意到差异时,是因为会话仍处于打开状态,并且上次触发了第950行的自动刷新。

    简短回答:发生了一些变化。我猜这不是程序的代码,否则你不会问的。这就离开了数据库。也许应用了一个修补程序,弥补了代码所依赖的漏洞。我从1981年开始从事这一行业,相信我,当时的环境中充斥着被补丁或升级破坏的代码——因为它依赖于未记录和不正确的行为。最后,这并不重要。您的过程应该关闭该文件,所以只需修复它。