如何使用UTL_FILE解析多行文件?在下面的示例代码段中 - 以' 1'开头的行是文件头 - 每个文件一个。 以' 5'开头的行是事务标题 - 每个事务一个 以' 8'开头的行是交易预告片 - 每笔交易一个 以' 9'开头的行是文件页脚 - 每个文件一个。
我需要逻辑1)读取文件行和2)能够区分事务的开始和结束位置。每行,我知道Oracle有instr和substr来区分其中的不同值。
欢迎任何建议!谢谢你的时间。
1TreasuryPart 201610031830MEMO
53336 Bank1Base0000001
650 3100000126 1-30-00010-00 000002126100000000000000021261USD20161003RAYMOND SOLIS jane.doe@gmail.com 205-888-9900 20161003020030000001 WEBENRAPC34560000000000 WEB
800000000010000000212610000000000000000001
53336 Bank1Base0000002
800000000000000000000000000000000000000002
53343 ToddMUD 0000001
800000000000000000000000000000000000000001
53343 ToddMUD 0000002
800000000000000000000000000000000000000002
53351 DenisTM 0000001
650 3100000128 7779026 000004000000000000000000080000USD20161003Denis Pellerin jack.doe@gmail.com 405-922-2116 20161003100421000001 WEBUNEAPC34560000000000 WEB
650 3100000128 7779026 000004000000000000000000080000USD20161003Denis Pellerin jack.doe@gmail.com 405-922-2116 20161003100421000002 WEBUNEAPC34560000000000 WEB
800000000020000000800000000000000000000001
53351 DenisTM 0000002
800000000000000000000000000000000000000002
9000006000000000003000000101261000000000000
答案 0 :(得分:0)
我不太确定你在寻找什么。发布代码总是有用的,因此我们不会猜测。我认为您需要这样的内容,其中定义了单独的过程来解析每种类型的行。
declare
l_file utl_file.file_type;
l_line varchar2(4000);
l_in_transaction boolean := false;
begin
l_file := utl_file.fopen( <<parameters>> );
loop
utl_file.get_line(l_file, l_line);
if( substr(l_line,1,1) = '1' and l_in_transaction = false)
then
parse_file_header( l_line );
end if;
if( substr(l_line,1,1) = '5' and l_in_transaction = false )
then
parse_transaction_header( l_line );
l_in_transaction := true;
end if;
if( l_in_transaction = true)
then
parse_transaction_row( l_line );
end if;
if( substr(l_line,1,1) = '8' and l_in_transaction = true)
then
parse_transaction_trailer( l_line );
l_in_transaction := false;
end if;
if( substr(l_line,1,1) = '9' and l_in_transaction = false)
then
parse_file_trailer( l_line );
end if;
end loop;
exception
when no_data_found
then
utl_file.fclose( l_file );
end;