mysql utl_file_利用UTL_FILE包实现文件I/O操作
摘要:本文主要討論如何利用Oracle的UTL_FILE包來實(shí)現(xiàn)對(duì)磁盤文件的I/O操作。
文件I/O對(duì)于數(shù)據(jù)庫的開發(fā)來說顯得很重要,比如如果數(shù)據(jù)庫中的一部分?jǐn)?shù)據(jù)來自于磁盤文件,那么就需要使用I/O接口把數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫中來。在PL/SQL中沒有直接的I/O接口,一般在調(diào)試程序時(shí)可以使用Oracle自帶的DBMS_OUTPUT包的put_line函數(shù)(即向屏幕進(jìn)行I/O操作)即可,但是對(duì)于磁盤文件的I/O操作它就無能為力了。其實(shí)Oracle同樣也提供了可以進(jìn)行文件I/O的實(shí)用包-----UTL_FILE包,利用這個(gè)實(shí)用包提供的函數(shù)來實(shí)現(xiàn)對(duì)磁盤的I/O操作。
1. 準(zhǔn)備工作
由于Oracle數(shù)據(jù)庫對(duì)包創(chuàng)建的目錄有一個(gè)安全管理的問題,所以并不是所有的文件目錄能夠被UTL_FILE包所訪問,要更新這種目錄設(shè)置,就得到init.ora里將UTL_FILE_DIR域設(shè)置為*,這樣UTL_FILE包就可以對(duì)所有的目錄文件進(jìn)行訪問了。
2. 文件I/O的實(shí)施
UTL_FILE包提供了很多實(shí)用的函數(shù)來進(jìn)行I/O操作,主要有以下幾個(gè)函數(shù):
fopen
打開指定的目錄路徑的文件。
get_line
獲取指定文件的一行的文本。
put_line
向指定的文件寫入一行文本。
fclose
關(guān)閉指定的文件。
下面利用這些函數(shù),實(shí)現(xiàn)從文件取數(shù)據(jù),然后將數(shù)據(jù)寫入到相應(yīng)的數(shù)據(jù)庫中。
create or replace procedure loadfiledata(p_path varchar2,p_filename varchar2) as
v_filehandle utl_file.file_type; --定義一個(gè)文件句柄
v_text varchar2(100); --存放文本
v_name test_loadfile.name%type;
v_addr_jd test_loadfile.addr_jd%type;
v_region test_loadfile.region%type;
v_firstlocation number;
v_secondlocation number;
v_totalinserted number;
begin
if (p_path is null or p_filename is null) then
goto to_end;
end if;
v_totalinserted:=0;
/*open specified file*/
v_filehandle:=utl_file.fopen(p_path,p_filename,'r');
loop
begin
utl_file.get_line(v_filehandle,v_text);
exception
when no_data_found then
exit;
end ;
v_firstlocation:=instr(v_text,',',1,1);
v_secondlocation:=instr(v_text,',',1,2);
v_name:=substr(v_text,1,v_firstlocation-1);
v_addr_jd:=substr(v_text,v_firstlocation+1,v_secondlocation-v_firstlocation-1);
v_region:=substr(v_text,v_secondlocation+1);
/*插入數(shù)據(jù)庫操作*/
insert into test_loadfile
values (v_name,v_addr_jd,v_region);
commit;
end loop;
<>
null;
end loadfiledata;
/
3. 測(cè)試環(huán)境
首先要?jiǎng)?chuàng)建一個(gè)目標(biāo)表TEST_LOADFILE,它用來存儲(chǔ)文件中的數(shù)據(jù):
CREATE TABLE TEST_LOADFILE (
NAME VARCHAR2 (100) NOT NULL,
ADDR_JD VARCHAR2 (20),
REGION VARCHAR2 (6) ) ;
然后就可以在sqlplus里輸入如下的代碼并執(zhí)行即可。
declare
v_path varchar2(200);
v_filename varchar2(200);
begin
v_path:='F:\ ';
v_filename:='地址信息.txt';
loadfiledata(v_path,v_filename);
end;
/
需要注意的是,這里我的調(diào)試路徑為“f:\”地址,如果讀者自己建立實(shí)驗(yàn)環(huán)境,應(yīng)該設(shè)置為的“地址信息”文件的路徑
整個(gè)調(diào)試環(huán)境是:
服務(wù)器端:UNIX操作系統(tǒng)+Oracle9i數(shù)據(jù)庫服務(wù)器,
客戶端: sqlplus,操作系統(tǒng)為WIN2000。
4. 小結(jié)
Oracle本身提供了大量使用的包,如UTL_HTTP包,DBMS_OUTPUT包等,這些包分別封裝了不同的功能,它們使得進(jìn)行大量的應(yīng)用程序開發(fā)的可能,從而拓展了Oracle的功能。
create or replace procedure test_error
(
str out varchar2,
str2 out varchar2
)
as
begin
declare
isto_file utl_file.file_type;
err_num number;
i number;
k number;
m number;
err_msg varchar2(100);
fp_buffer varchar2(4000);
begin
isto_file := utl_file.fopen('IST0_DIR', 'kj021320.txt', 'W');
i:=0;
while (i<2)
loop
utl_file.put_line(isto_file, 'My');
i:=i+1;
end loop;
utl_file.fflush(isto_file);
utl_file.fclose(isto_file);
isto_file := utl_file.fopen('IST0_DIR', 'kj021320.txt', 'a');
m:=0;
while (m<2)
loop
utl_file.put_line(isto_file, 'My');
m:=m+1;
end loop;
utl_file.fflush(isto_file);
utl_file.fclose(isto_file);
isto_file := utl_file.fopen('IST0_DIR', 'kj021320.txt', 'R');
str2:='';
loop
utl_file.get_line (isto_file , fp_buffer );
str2:=str2 || fp_buffer;
end loop;
utl_file.fclose(isto_file);
for j in 1..10? /* for */
loop
k:=11;
end loop;
EXCEPTION
WHEN OTHERS THEN
err_num:=sqlcode; /* 異常num */
err_msg:=substr(sqlerrm,1,100); /* 異常msg */
str:=substr(sqlerrm,1,100);
end;
end test_error;
首先我們得先建立一個(gè)ORACLE的目錄對(duì)象 指向C:"
create or replace directory IST0_DIR as ’C:"’;
--然后我們對(duì)這個(gè)目錄對(duì)象進(jìn)行授權(quán)其實(shí)這步可以忽略grant read, write on directory IST0_DIR to用戶;
--以上前奏完成了! 我們可以寫PLSQL進(jìn)行操作文件了
總結(jié)
以上是生活随笔為你收集整理的mysql utl_file_利用UTL_FILE包实现文件I/O操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python使用ffmpeg批量将flv
- 下一篇: SPOJ7258 SUBLEX - Le