Sql 理解Utl_文件
所以我改变了这个解析文件“清理文件”的过程。我已经编写了更改代码,但在测试后我意识到 事实上,我很难理解到底发生了什么。我从来没有解析过文件或utl_文件,所以我不完全理解 解开这个概念 总之,我们需要它从一个名为NEWFILE_directory的目录中查找一个名为Files20130807.xxx的文件,其中包含当前sysdate。 如果没有文件意味着找不到与当前系统日期匹配的文件,则需要运行位于的原始文件 在另一个名为ORIGINALFILE_的目录中,然后转到过程的末尾。如果有一个文件与 当前sysdate,则需要继续执行该过程。当它真正打开文件时,它将打开 匹配来自NEWFILE_目录的当前sysdate,然后将解析该文件,否则如果当前文件来自NEWFILE_目录 如果打开,则需要打开位于ORIGNIALFILE_目录中的原始文件,然后解析该文件Sql 理解Utl_文件,sql,oracle,directory,procedure,utl-file,Sql,Oracle,Directory,Procedure,Utl File,所以我改变了这个解析文件“清理文件”的过程。我已经编写了更改代码,但在测试后我意识到 事实上,我很难理解到底发生了什么。我从来没有解析过文件或utl_文件,所以我不完全理解 解开这个概念 总之,我们需要它从一个名为NEWFILE_directory的目录中查找一个名为Files20130807.xxx的文件,其中包含当前sysdate。 如果没有文件意味着找不到与当前系统日期匹配的文件,则需要运行位于的原始文件 在另一个名为ORIGINALFILE_的目录中,然后转到过程的末尾。如果有一个文件与
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);
如果结束;
例外情况
当其他人
条件
结束清理文件;
问题:
如果我需要澄清问题(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;