如何使用UTL_FILE

时间:2019-01-24 12:30:09

标签: oracle plsql oracle-sqldeveloper

我有一个包含数千行的文件,我需要获取第二行(大约50个字符)和文件的最后一行的一部分。请指教。谢谢。

我正在尝试做类似UTL_FILE.READLINE(fileloc,filename,nrow,lastrow)的事情。

示例: 文件名:CLOSED_SO_20190124.txt

DATA in the FILE:
    0246608377|22795124004|
    650930363|1-8IGO3S82920|
    0245563264|22669075004|
    0245563264|22669075004|
    164260364|1-2DFE-6573219|
    650821459|1-6HWQUF11209|

EXPECTED OUTPUT:

    650930363|1-8IGO3S82920|
    650821459|1-6HWQUF11209|

2 个答案:

答案 0 :(得分:2)

这是一个例子。

目录名称及其位置以及示例文件内容:

SQL> select directory_name, directory_path from all_directories;

DIRECTORY_NAME                 DIRECTORY_PATH
------------------------------ --------------------
EXT_DIR                        c:\temp

SQL> $type c:\temp\sofile.txt
0246608377|22795124004|
650930363|1-8IGO3S82920|
0245563264|22669075004|
0245563264|22669075004|
164260364|1-2DFE-6573219|
650821459|1-6HWQUF11209|
SQL>

过程:本地计数器(l_cnt)知道行号;如果等于2,则显示该行。另外,当什么都没有找到时(因此执行了异常处理程序部分),我已经到达文件的末尾,因此我也显示了最后一行。

SQL> set serveroutput on
SQL>
SQL> declare
  2    l_file utl_file.file_type;
  3    l_dir  varchar2(20) := 'EXT_DIR';
  4    l_name varchar2(20) := 'sofile.txt';
  5    l_line varchar2(50);
  6    l_cnt  number := 0;
  7  begin
  8    l_file := utl_file.fopen (l_dir, l_name, 'R');
  9    loop
 10      begin
 11        utl_file.get_line(l_file, l_line);
 12        l_cnt := l_cnt + 1;
 13        if l_cnt = 2 then
 14           dbms_output.put_line('2nd : ' || l_line);
 15        end if;
 16      exception
 17        when no_data_found then
 18          dbms_output.put_line('last: ' || l_line);
 19          exit;
 20      end;
 21    end loop;
 22    utl_file.fclose(l_file);
 23  end;
 24  /
2nd : 650930363|1-8IGO3S82920|
last: 650821459|1-6HWQUF11209|

PL/SQL procedure successfully completed.

SQL>

答案 1 :(得分:0)

在Oracle 11g中

select col 
from 
(
  select 
    rownum AS rnum, 
    LEFT(myCol, 50) col
  from Table1
  where Rownum < 3
)
WHERE rnum = 2

在Oracle 12c中

select LEFT(mycol, 50) col
from Table1
ORDER BY val
OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY;

对于最后一行

select LEFT(mycol, 50) col
from my_table
where pk = ( select max(pk) from my_table )

然后您可以将它们合并