使用不同的底层文件内容多次读取同一个 Oracle 外部表会引发错误 KUP-05011:文件大小已更改

Posted

技术标签:

【中文标题】使用不同的底层文件内容多次读取同一个 Oracle 外部表会引发错误 KUP-05011:文件大小已更改【英文标题】:Reading the same Oracle external table multiple times with the different underlying file content raises the error KUP-05011: Size of file has changed 【发布时间】:2020-04-30 14:42:54 【问题描述】:

我尝试使用不同的基础文件内容多次读取同一个 Oracle 外部表。

我使用 java 应用程序的代码片段如下:

int sptepn = 1;
for (File file: files) 
    log_step(stepn++);
    copy_file_to_oracle_directory(file); // copy myfileN.txt to myfile.txt
    call_oracle_sp_read_file();

在 pl/sql 过程中,我使用如下代码片段:

procedure read_file() is
    cursor ext_cu is
      select * from ext_table;
begin
    for ext_rec in ext_cu loop
      -- do something with ext_rec.*
    end loop;
end read_file;

在一组数据库服务器上,这个 pl/sql 过程可以正常工作。但是在另一组 db-servers 上,在第 2 步(java 过程)上调用这个 pl/sql 过程会引发错误:

29913-ORA-29913: error in executing ODCIEXTTABLEFETCH callout: ORA-29400: data cartridge error: KUP-05011: Size of file myfile.txt in directory /mydir has changed from 12345 to 67890.

myfile1.txt 的大小为 12345,myfile2.txt 的大小为 67890。

有什么问题?

受影响的服务器版本:

Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
PL/SQL Release 12.2.0.1.0 - Production
"CORE   12.2.0.1.0  Production"
TNS for IBM/AIX RISC System/6000: Version 12.2.0.1.0 - Production
NLSRTL Version 12.2.0.1.0 - Production

【问题讨论】:

您使用什么 DDL 创建外部表? Oracle 会跟踪有关外部表中文件的元数据,并且您通常无法在不更改表以读取新文件的情况下将它们交换出去。 DDL 是:CREATE TABLE "EXT_TABLE" ( "FLDA" VARCHAR2(100 BYTE), "FLDB" VARCHAR2(100 BYTE), "FLDC" VARCHAR2(100 BYTE) ) ORGANIZATION EXTERNAL ( TYPE ORACLE_LOADER DEFAULT DIRECTORY "LOGDIR" ACCESS PARAMETERS ( RECORDS DELIMITED BY newline SKIP 1 FIELDS TERMINATED BY "\t" MISSING FIELD VALUES ARE NULL REJECT ROWS WITH ALL NULL FIELDS ) LOCATION ( "MYDIR":'myfile.txt' ) ) REJECT LIMIT UNLIMITED ; 为外部表交换文件在我们的大多数服务器上都能正常工作。 【参考方案1】:

告诉 Oracle 您更改了文件怎么样?而不是将 myfileN.txt 复制到 myfile.txt 我会尝试将数字保留在文件名中并更改外部表:

ALTER TABLE ext_table LOCATION ("MYDIR":'myfile1.txt');
read_file();

ALTER TABLE ext_table LOCATION ("MYDIR":'myfile2.txt');
read_file();
...

【讨论】:

以上是关于使用不同的底层文件内容多次读取同一个 Oracle 外部表会引发错误 KUP-05011:文件大小已更改的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Oracle SQL Developer 中多次执行相同的存储过程?

.Net Core 读取Json配置文件

python文件操作:pickle模块多次dump后出现的读取问题

多次读取HttpEntity内容

include与require的区别?

java 读取大容量文件,内存溢出?怎么按几行读取,读取多次。