所以我正在改变这个 parse_file 'clean_files_up procedure' 的过程。我已经对更改进行了编码,但在测试后我意识到我实际上很难理解发生了什么。我从未使用过解析文件或 utl_file,所以我并不完全理解这个概念。
因此,总而言之,我们需要它从名为 NEWFILE_DIRECTORY 的目录中查找具有当前 sysdate 的名为 Files20130807.xxx 的文件。如果没有文件意味着它找不到与当前 sysdate 匹配的文件,则需要运行位于名为 ORIGINALFILE_DIRECTORY 的不同目录中的原始文件,然后结束该过程。如果存在与当前 sysdate 匹配的文件,则需要继续执行该过程。当它实际打开文件时,它将打开与 NEWFILE_DIRECTORY 中的当前 sysdate 匹配的文件,然后解析该文件,否则如果 NEWFILE_DIRECTORY 中的当前文件已打开,则需要打开位于 ORIGNIALFILE_DIRECTORY 中的原始文件和然后将改为解析该文件。
PROCEDURE clean_files_up IS
v_fileName VARCHAR2(20) := Files || to_char(sysdate, 'YYYYMMDD') || '.xxx';
v_inFile utl_file.file_type;
v_outFile utl_file.file_type;
v_line VARCHAR2(2000);
v_newLine VARCHAR2(2000);
v_count NUMBER := 1;
BEGIN
--No Files found for current date
IF (substr(v_fileName, 6, 8)) <> to_char(sysdate, 'YYYYMMDD') THEN
v_inFile := utl_file.fopen('ORIGINALFILE_DIRECTORY', 'OriginalFile.xxx', 'r');
RETURN; --go to end of procedure
END IF;
v_inFile := utl_file.fopen ('NEWFILE_DIRECTORY', 'v_fileName', 'r');
IF utl_file.is_open(v_inFile) THEN
v_outFile := utl_file.fopen('ORIGINALFILE_DIRECTORY',
'OriginalFile.xxx',
'W');
LOOP
BEGIN
utl_file.get_line(v_inFile, v_line);
IF v_line IS NULL THEN
EXIT;
END IF;
IF v_count > 1 THEN
get_new_csv_line(v_line, v_newLine);
utl_file.put_line(v_outFile, v_newLine);
utl_file.fflush(v_outFile);
END IF;
v_count := v_count + 1;
EXCEPTION
WHEN no_data_found THEN
EXIT;
END;
END LOOP;
utl_file.fclose(v_outFile);
END IF;
EXCEPTION
WHEN OTHERS THEN
Condition;
END clean_files_up;
问题:
- 所以我需要创建一个名为 NEWFILE_DIRECTORY 的新目录,该目录位于某个文件路径 /xxx/xxx/xxx 中,其中包含以下文件列表;Files20130804.xxx, Files20130805.xxx, Files20130806.xxx, Files20130807 位于其中。我不知道在此过程中的哪个位置创建新目录,或者即使我可以在过程中创建它
在 '/xxx/xxx/xxx' 中创建或替换目录 newfile_directory
2.. 我需要读入这些文件以确保它与 sysdate 匹配,否则它需要运行原始文件,然后转到程序的末尾。这部分是 BEGIN 之后的 IF 语句。我只是对它如何知道在 NEWFILE_DIRECTORY 中查找匹配的文件名 Files20130807.xxx 以查看它是否匹配感到困惑。
3 .. 这是一个与#2 类似的问题,但是(在第一个 End IF 之后)它如何知道 NEWFILE_DIRECOTRY 和 ORIGINALFILE_DIRECTORY 的文件路径位于何处而不给出或定义路径?
4.. 最后,在测试代码时,我注意到在它读入 v_inFile := utl_file.fopen ('NEWFILE_DIRECTORY', 'v_fileName', 'r'); (就在第一个 End IF 之后;)它下降到异常而不继续通过 if 和循环。
我真的很感激有人可以回答这些问题至少有助于了解发生了什么。此外,如果我需要明确问题(1-4),我可以这样做。