0

所以我正在改变这个 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;

问题:

  1. 所以我需要创建一个名为 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),我可以这样做。

4

2 回答 2

1

关于您的问题的答案:

1) 以下代码创建从 Oracle 内部定义的目录(可以通过从 DBA_DIRECTORIES 中选择数据来查看它们)到文件系统目录的链接。

CREATE OR REPLACE DIRECTORY NEWFILE_DIRECTORY AS '/xxx/xxx/xxx'

如果文件系统中已经存在路径'/xxx/xxx/xxx',那么这将是正确的方法。

2)如果我理解正确,那么您必须检查 NEWFILE_DIRECTORY 中是否存在名称中包含当前日期的文件。可以通过以下功能完成:

FUNCTION check_if_file_exists
  (p_file_name IN VARCHAR2
  ,p_file_dir IN VARCHAR2)
RETURN BOOLEAN
IS
  v_file  utl_file.file_type;
BEGIN
  v_file := utl_file.fopen(p_file_dir, p_file_name, 'R');

  IF utl_file.is_open(v_file) THEN
    RETURN TRUE;
  ELSE
    RETURN FALSE;
  END IF;
EXCEPTION
  WHEN UTL_FILE.invalid_path THEN
    RETURN FALSE;
  WHEN utl_file.invalid_operation THEN
    RETURN FALSE;
END check_if_file_exists;

你的第一个 if 将是:

IF check_if_file_exists(v_fileName, 'NEWFILE_DIRECTORY') THEN

3)您可以通过“CREATE OR REPLACE DIRECTORY”创建数据库目录(映射数据库以查找文件系统路径)(参见#1)

4)您将参数作为字符串值'v_fileName'而不是变量v_fileName传递。正确的代码是:

v_inFile := utl_file.fopen ('NEWFILE_DIRECTORY', v_fileName, 'r');   
于 2013-08-08T08:28:10.207 回答
0

Janis Baiza 谢谢你的回答,它真的帮助我理解发生了什么。

我实际上发现这将检查文件是否也存在于当前目录中,如果存在则输出它存在,如果不存在则输出它不存在并运行原始文件然后返回程序结束。

utl_file.fgetattr ('NEWFILE_DIRECTORY', v_fileName, v_check_fileEX, v_fLength, v_Bsize );
IF v_check_fileEX THEN
dbms_output.put_line('file exists');
END IF;
IF NOT v_check_fileEX THEN
dbms_output.put_line('file does not exist');

v_inFile := utl_file.fopen('ORIGINALFILE_DIRECTORY', 'OriginalFile.xxx', 'r');

 RETURN; 
END IF;
于 2013-08-08T16:54:13.070 回答