使用不同的底层文件内容多次读取同一个 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 中多次执行相同的存储过程?