Sql 理解Utl_文件

Sql 理解Utl_文件,sql,oracle,directory,procedure,utl-file,Sql,Oracle,Directory,Procedure,Utl File,所以我改变了这个解析文件“清理文件”的过程。我已经编写了更改代码,但在测试后我意识到 事实上,我很难理解到底发生了什么。我从来没有解析过文件或utl_文件,所以我不完全理解 解开这个概念 总之,我们需要它从一个名为NEWFILE_directory的目录中查找一个名为Files20130807.xxx的文件,其中包含当前sysdate。 如果没有文件意味着找不到与当前系统日期匹配的文件,则需要运行位于的原始文件 在另一个名为ORIGINALFILE_的目录中,然后转到过程的末尾。如果有一个文件与

所以我改变了这个解析文件“清理文件”的过程。我已经编写了更改代码,但在测试后我意识到 事实上,我很难理解到底发生了什么。我从来没有解析过文件或utl_文件,所以我不完全理解 解开这个概念

总之,我们需要它从一个名为NEWFILE_directory的目录中查找一个名为Files20130807.xxx的文件,其中包含当前sysdate。 如果没有文件意味着找不到与当前系统日期匹配的文件,则需要运行位于的原始文件 在另一个名为ORIGINALFILE_的目录中,然后转到过程的末尾。如果有一个文件与 当前sysdate,则需要继续执行该过程。当它真正打开文件时,它将打开 匹配来自NEWFILE_目录的当前sysdate,然后将解析该文件,否则如果当前文件来自NEWFILE_目录 如果打开,则需要打开位于ORIGNIALFILE_目录中的原始文件,然后解析该文件

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;
正在执行清除文件的过程
v|fileName VARCHAR2(20):=Files | | to| char(sysdate,'yyyyymmdd')| |'.xxx';
v_infle utl_file.file_类型;
v_outFile utl_file.file_类型;
v_line VARCHAR2(2000年);
v_newLine VARCHAR2(2000年);
v_计数编号:=1;
开始
--找不到当前日期的文件
如果(substr(v_fileName,6,8))到_char(sysdate,'yyyyymmdd'),那么
v_infle:=utl_file.fopen('ORIGINALFILE_DIRECTORY','ORIGINALFILE.xxx','r');
返回--转到程序的末尾
如果结束;
v_infle:=utl_file.fopen('NEWFILE_DIRECTORY','v_fileName','r');
如果utl_文件.u打开(v_infle),则
v_outFile:=utl_file.fopen('ORIGINALFILE_DIRECTORY',
“OriginalFile.xxx”,
"W";;
环
开始
utl_文件。获取_行(v_infle,v_行);
如果v_线为空,则
出口
如果结束;
如果v_计数>1,则
获取新的csv行(v行,v行);
utl_文件.put_行(v_输出文件,v_新行);
utl_文件.fflush(v_输出文件);
如果结束;
v_计数:=v_计数+1;
例外情况
当找不到数据时
出口
结束;
端环;
utl_file.fclose(v_outFile);
如果结束;
例外情况
当其他人
条件
结束清理文件;
问题:

  • 因此,我需要创建一个名为NEWFILE_directory的新目录,该目录位于文件路径/xxx/xxx/xxx中,其中包含文件列表 喜欢文件20130804.xxx、文件20130805.xxx、文件20130806.xxx、文件20130807位于其中。我不知道 在这个过程中,我将创建新目录,或者即使我可以在这个过程中创建它
  • 在“/xxx/xxx/xxx”中创建或替换目录newfile\u目录

    二,。。我需要读入这些文件以确保它与sysdate匹配,否则它需要运行原始文件并 然后走到程序的末尾。这部分是在开始之后的IF语句。我只是不明白它是怎么知道的 在NEWFILE_目录中查找匹配的文件名Files20130807.xxx,查看是否匹配

    3。。这是一个与#2类似的问题,但是(在第一个结束IF;)之后,它如何知道NEWFILE#u DIRECOTRY的文件路径在哪里 原始文件_目录的位置没有给出或定义路径

    四,。。最后,在测试代码时,我注意到在它读入v_infle之后:=utl_file.fopen('NEWFILE_DIRECTORY','v_fileName','r'); (在第一个结束IF之后;)它进入异常,而不继续通过IF和循环

    如果有人能回答这些问题,至少有助于理解正在发生的事情,我将不胜感激。阿尔索
    如果我需要澄清问题(1-4),我可以这样做

    回答您的问题:

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

    CREATE OR REPLACE DIRECTORY NEWFILE_DIRECTORY AS '/xxx/xxx/xxx'
    
    若文件系统中已经存在路径“/xxx/xxx/xxx”,那个么这将是正确的方法

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

    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) 您可以通过“创建或替换目录”(参见#1)创建DB目录(映射DB以查找文件系统路径)

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

    v_inFile := utl_file.fopen ('NEWFILE_DIRECTORY', v_fileName, 'r');   
    

    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;