我必須協調數據是否從平面文件加載到表中。我必須創建一個oracle數據集成包/接口/過程來執行unix命令來統計csv文件中的行數並將結果存儲在一個表中,然後我必須查詢已加載的表和行數,並存儲表和必須比較是否統計,請幫助我如何使包/接口/過程執行unix命令並將結果存儲在oracle表中。如何通過odi執行unix命令並將結果存儲在表
由於提前
我必須協調數據是否從平面文件加載到表中。我必須創建一個oracle數據集成包/接口/過程來執行unix命令來統計csv文件中的行數並將結果存儲在一個表中,然後我必須查詢已加載的表和行數,並存儲表和必須比較是否統計,請幫助我如何使包/接口/過程執行unix命令並將結果存儲在oracle表中。如何通過odi執行unix命令並將結果存儲在表
由於提前
我不會解決這個使用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;