2013-11-21 29 views
0

我必須協調數據是否從平面文件加載到表中。我必須創建一個oracle數據集成包/接口/過程來執行unix命令來統計csv文件中的行數並將結果存儲在一個表中,然後我必須查詢已加載的表和行數,並存儲表和必須比較是否統計,請幫助我如何使包/接口/過程執行unix命令並將結果存儲在oracle表中。如何通過odi執行unix命令並將結果存儲在表

由於提前

回答

0

我不會解決這個使用Oracle數據集成,而是簡單地用一個Oracle包。當已處理的文件位於同一節點上時,可以這樣做,並且可以使用utl_file和類似的軟件包訪問它。您可以從PL/SQL打開CSV文件,對可用的不同行結束樣式(CR/LF/CRLF)進行計數,然後再次關閉該文件。 這並沒有提供運行UNIX語句(如'grep')的其他功能,但是使用utl_file您可以打開/讀取/寫入/關閉文件,甚至可以列出目錄中的文件。 一個免費的獎勵是,代碼變得更容易移植到其他平臺(Windows,VMS去哪裏?)。

請參閱下面的一些樣本,這些樣本取自我們在Invantive開發的軟件(隨意使用)。您可能想要使用load_xxx_from_directory,然後執行regexp_count作爲一個簡單的解決方案。或者只是在循環中自行計算CR/LF/CRLF。

-- 
    -- Load a file into a blob. Clob needed? Change blob to clob. 
    -- 
    procedure load_blob_from_directory 
    (p_file  out nocopy blob 
    , p_directory all_directories.directory_name%type 
    , p_filename varchar2 
) 
    is 
    l_read_buffer_size constant pls_integer := 32767; 
    -- 
    l_fh    utl_file.file_type; 
    l_read_buffer  raw(32767); 
    l_bytes_read_sofar integer; 
    l_bytes_read  integer; 
    begin 
    if p_file is null 
    then 
     dbms_lob.createtemporary(p_file, true); 
    end if; 
    l_fh := utl_file.fopen(p_directory, p_filename, 'rb'); 
    l_bytes_read_sofar := 0; 
    begin 
     while true 
     loop 
     utl_file.get_raw(l_fh, l_read_buffer, l_read_buffer_size); 
     l_bytes_read := length(l_read_buffer)/2; 
     dbms_lob.write(p_file, l_bytes_read, l_bytes_read_sofar+1, l_read_buffer); 
     l_bytes_read_sofar := l_bytes_read_sofar + l_bytes_read; 
     end loop; 
    exception 
     when no_data_found 
     then 
     null; 
    end; 
    utl_file.fclose(l_fh); 
    exception 
    when others 
    then 
     -- 
     -- Close file if necessary. 
     -- Ignore any errors. 
     -- 
     begin 
     if utl_file.is_open(l_fh) 
     then 
      utl_file.fclose(l_fh); 
     end if; 
     exception 
     when others 
     then 
      null; 
     end; 
     -- 
     rollback; 
     itgen_error_handler.add_to_inner_stack; 
     raise; 
    end; 

保存到一個文件:

-- 
    -- Save the file in blob format to an Oracle directory. 
    -- 
    procedure save_blob_to_directory 
    (p_file  blob 
    , p_directory all_directories.directory_name%type 
    , p_filename varchar2 
) 
    is 
    l_piece_length constant pls_integer := 32767; 
    -- 
    l_fh utl_file.file_type; 
    begin 
    l_fh := utl_file.fopen(p_directory, p_filename, 'wb'); 
    for i in 0 .. trunc((dbms_lob.getlength(p_file) - 1)/l_piece_length) 
    loop 
     utl_file.put_raw 
     (l_fh 
     , dbms_lob.substr 
     (p_file 
     , l_piece_length 
     , i * l_piece_length + 1 
     ) 
    ); 
    end loop; 
    utl_file.fclose(l_fh); 
    exception 
    when others 
    then 
     -- 
     -- Close file if necessary. 
     -- Ignore any errors. 
     -- 
     begin 
     if utl_file.is_open(l_fh) 
     then 
      utl_file.fclose(l_fh); 
     end if; 
     exception 
     when others 
     then 
      null; 
     end; 
     -- 
     rollback; 
     itgen_error_handler.add_to_inner_stack; 
     raise; 
    end; 

這裏是如何獲取文件的大小:

function get_file_length 
(p_directory_name varchar2 
, p_file_name  varchar2 
) 
return number 
is 
    l_file_length  number; 
    l_file_exists  boolean; 
    l_file_block_size number; 
begin 
    utl_file.fgetattr 
    (location => p_directory_name 
    , filename => p_file_name 
    , fexists  => l_file_exists 
    , file_length => l_file_length 
    , block_size => l_file_block_size 
); 
    return l_file_length; 
end; 

這裏是如何得到一個目錄的內容:

function list_files 
(p_directory_name all_directories.directory_name%type 
) 
return itgen_tab_file 
pipelined 
as 
    l_directory_path all_directories.directory_path%type; 
    l_ns    varchar2(1024); 
begin 
    select dry.directory_path 
    into l_directory_path 
    from all_directories dry 
    where dry.directory_name = p_directory_name 
    ; 
    sys.dbms_backup_restore.searchfiles(l_directory_path, l_ns); 
    for r_files in 
    (select fname_krbmsft file_name 
    from sys.itgen_x_krbmsft 
) 
    loop 
    pipe row 
    (itgen_rec_file 
     (p_directory_name 
     , r_files.file_name 
     , itgen_utilities.get_file_length (p_directory_name, r_files.file_name) 
    ) 
    ); 
    end loop; 
end; 
相關問題