问题描述
我有一个使用外部表的 PLsql ABC(示例名称)应用程序。该应用程序的简要概述如下。
该应用程序使用 unix 服务器上的一个日志池,一个文件(包含一些记录)被另一个应用程序在每天的某个随机时间放置在日志池中,这个文件被 ABC 应用程序由一个 oracle JOB(它每 10 分钟发生一次)并重命名为 Progress.txt(示例名称)。有一些外部表从重命名的文件(Progress.txt)中加载数据并从文件中执行读取操作,根据我们的评估,相应地生成了一些文件,如Progress.log、Progress.bad(对于坏记录)。对文件执行我们将记录放入不同目录的文件,例如好的记录到名为“good”目录的文件和坏记录或错误记录到坏目录。评估完成后,重命名的文件将重新命名为原始名称。
--------------------------------------------------------
-- DDL for Procedure PR_IMPORT_AUDIT_LOG
--------------------------------------------------------
set define off;
CREATE OR REPLACE EDITIONABLE PROCEDURE "ABC"."PR_IMPORT_AUDIT_LOG"
AS
--CURSOR CUR_FILE_LIST,is loaded with correct file names from the external table
--EXT_TAB_IMPORT_FILE_LIST (This external table searches the logpool dir for any files present)
--CURSOR CUR_WRONG_FILES_LIST,is loaded with incorrect file names from the external table
V_INSERT_TIMESTAMP TIMESTAMP := SYSTIMESTAMP;
BEGIN
--CHECK IF EXISTS NOT ALLOWED FILENAMES
FOR REC_FILE_LIST IN CUR_WRONG_FILES_LIST
LOOP
--SEND ERROR MAIL
DECLARE
V_SUBJECT VARCHAR2(255) := 'ABC: Import of "'||REC_FILE_LIST.FNAME||'" is raising an error';
V_BODY VARCHAR2(10000) := 'Hi,' || chr(10) || chr(10) || 'during the import of the file "'||REC_FILE_LIST.FNAME||'" the following errors have occurred:';
BEGIN
V_BODY := V_BODY || chr(10) ||'- Error 020 = Wrong file name';
V_BODY := V_BODY || chr(10) || chr(10) || 'Please contact the respective IT system for correction. ';
SEND_MAIL('AL_IMPORT_ERROR_HANDLING',V_SUBJECT,V_BODY);
END;
--MOVE FILE TO ERROR FOLDER
UTL_FILE.FRENAME('ABC_AUDITLOG',REC_FILE_LIST.FNAME,'ABC_IMPORTBAD',TRUE);
END LOOP;
FOR REC_FILE_LIST IN CUR_FILE_LIST -- This cursor contains all valid file name. How can I make the filename in this iteration avaialble to the external table to so that they kNow current file name under process.
LOOP
--RENAME FILE IN inProgress.txt
UTL_FILE.FRENAME('ABC_AUDITLOG','ABC_AUDITLOG','inProgress.txt',TRUE);
--Perform some business logic
--remove inProgress.bad
BEGIN
UTL_FILE.FREMOVE('ABC_AUDITLOG','inProgress.bad');
EXCEPTION
WHEN OTHERS
THEN
IF sqlCODE = -29283 -- suppresses no file found exception
THEN
NULL;
ELSE
RAISE;
END IF;
END;
--remove inProgress.log
BEGIN
UTL_FILE.FREMOVE('ABC_AUDITLOG','inProgress.log');
EXCEPTION
WHEN OTHERS
THEN
IF sqlCODE = -29283 -- suppresses no file found exception
THEN
NULL;
ELSE
RAISE;
END IF;
END;
COMMIT;
END LOOP;
EXCEPTION
WHEN OTHERS
--send some error email
END;
/
光标 CUR_FILE_LIST 包含所有有效的文件名。如何使此迭代中的文件名可用于外部表,以便他们知道正在处理的当前文件名,而无需重命名原始文件。
--------------------------------------------------------
-- DDL for Table EXT_TAB_AUDIT_LOG
--------------------------------------------------------
CREATE TABLE ABC.EXT_TAB_AUDIT_LOG
( --column deFinitions
)
ORGANIZATION EXTERNAL
( TYPE ORACLE_LOADER
DEFAULT DIRECTORY ABC_AUDITLOG
ACCESS ParaMETERS
( RECORDS DELIMITED BY NEWLINE
STRING SIZES ARE IN CHaraCTERS
LOGFILE 'inProgress.log'
BADFILE 'inProgress.bad'
disCARDFILE 'inProgress.dis'
FIELDS
(
--field names from the file
)
)
LOCATION
( 'inProgress.txt'
)
)
REJECT LIMIT UNLIMITED ;
问题在于: • 当AL 导入失败时,不会导入任何一条记录。 •错误增量文件为空 •原来的AL文件消失了!它没有移动到子文件夹(好或坏文件夹)。然后又开始了10分钟的程序,无法访问原始文件名(已重命名为inProgress.txt)。
重命名是一个问题,因为一旦失败,原始文件名就会丢失,并且无法检查丢失的是哪个文件。
Procedure PR_INSERT_AUDIT_LOG_FROM_FILE returned the following error:
ORA-29913: error in executing ODCIEXTTABLEFETCH callout
ORA-29400: data cartridge error
KUP-04039: unexpected error while trying to find file inProgress.txt in /opt/app/logpool/
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)