• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Myth's space
好好学习,不见进步
博客园    首页    新随笔    联系   管理    订阅  订阅

全面学习DBMS包之UTL_FILE

UTL_FILE包的简单介绍以及测试生成、读取OS文件
utl_file 包配合oracle的directory使我们在数据库中更加方便的对文件进行读写操作,下面看三个例子
1、写入外部文件
SQL> conn / as sysdba
已连接。
SQL
> show user
USER 为 "SYS"


SQL
> create or replace directory test_utl_file as 'f:/dump';

目录已创建。

SQL
> grant execute on utl_file to jrgazx;

授权成功。

SQL
> grant read,write on directory  test_utl_file to jrgazx;

授权成功。


SQL
> 
SQL
>  conn jrgazx/jrgazx
SQL
>  declare 
  
2   file utl_file.file_type;
  
3   begin
  
4   file :=utl_file.fopen('TEST_UTL_FILE','abc.txt','a');
  
5   utl_file.put_line(file,'I am writing to file');
  
6   utl_file.fclose(file);
  
7   end;
  
8  /

PL
/SQL 过程已成功完成。

这个例子首先以SYSDBA用户登录创建directory并授权给jrgazx用户,再以jrgazx用户登录执行了一段PL/SQL代码,执行成功后,在F:/DUMP目录下就能看到生成的abc.txt
其内容为
I am writing to file
2、把USER_OBJECTS表输出到外部文件
SQL> CONN JRGAZX/JRGAZX
已连接。


SQL
> create or replace procedure pro_test_writeInto_Osfile is
  
2    vOutHandle utl_file.file_type;
  
3    L_BUFFER   VARCHAR2(400);
  
4  
  
5  BEGIN
  
6    vOutHandle := utl_file.fopen('TEST_UTL_FILE',
  
7                                 'USER_OBJECTS' ||
  
8                                 TO_CHAR(SYSDATE, 'YYYYMMDD') || '.txt',
  
9                                 'W');
 
10    L_BUFFER   := 'object_name,object_id,object_type,created,last_ddl_time,timestamp,status';
 
11    FOR I IN (SELECT  OBJECT_NAME || ',' || OBJECT_ID || ',' ||
 
12                     OBJECT_TYPE || ',' || TO_CHAR(CREATED, 'YYYY-MM-DD hh24:mi:ss') || ',' ||
 
13                     TO_CHAR(LAST_DDL_TIME, 'YYYY-MM-DD hh24:mi:ss') || ',' || TIMESTAMP || ',' |
|
 
14                     STATUS RESULT
 
15                FROM USER_OBJECTS) LOOP
 
16      UTL_FILE.PUT_LINE(vOutHandle, I.RESULT);
 
17    END LOOP;
 
18    utl_file.fclose(vOutHandle);
 
19  exception
 
20    when others then
 
21      dbms_output.put_line('执行失败');
 
22      utl_file.fclose(vOutHandle);
 
23  END pro_test_writeInto_Osfile;
 
24  /

过程已创建。

SQL
> 
SQL
> EXEC  pro_test_writeInto_Osfile();

PL
/SQL 过程已成功完成。

三、从文件读取数据插入到数据库表


连接到: 
Oracle 
Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL
> create table t_object
  
2  as
  
3  select * from user_objects where 1=2;

表已创建。

SQL
> create or replace procedure pro_test_readfrom_Osfile(f_name varchar2)
  
2  is
  
3  vinhandle utl_file.file_type;
  
4  v_text varchar2(500);
  
5  begin
  
6  if f_name is null then
  
7  return;
  
8  end if;
  
9  vinhandle :=utl_file.fopen('TEST_UTL_FILE',f_name,'r');
 
10  loop
 
11  
 
12  utl_file.get_line(vinhandle,v_text);
 
13  insert into t_object (object_name,object_id,object_type,created,last_ddl_time,timestamp,status)

 
14  values
 
15  (
 
16  substr(v_text,1,instr(v_text,',',1,1)-1), 
 
17  substr(v_text,instr(v_text,',',1,1)+1,instr(v_text,',',1,2)-instr(v_text,',',1,1)-1),
 
18  substr(v_text,instr(v_text,',',1,2)+1,instr(v_text,',',1,3)-instr(v_text,',',1,2)-1),
 
19  to_date(substr(v_text,instr(v_text,',',1,3)+1,instr(v_text,',',1,4)-instr(v_text,',',1,3)-1),'y
yyy-mm-dd hh24:mi:ss
'),
 
20  to_date(substr(v_text,instr(v_text,',',1,4)+1,instr(v_text,',',1,5)-instr(v_text,',',1,4)-1),'y
yyy-mm-dd hh24:mi:ss
'),
 
21  substr(v_text,instr(v_text,',',1,5)+1,instr(v_text,',',1,6)-instr(v_text,',',1,5)-1),
 
22  substr(v_text,-1,instr(v_text,',',1,1))
 
23  );
 
24  commit;
 
25  end loop;
 
26  end;
 
27  
 
28  
 
29  
 
30  
 
31  
 
32  
 
33  
 
34  
 
35  
 
36  
 
37  
 
38  
 
39  
 
40  /

过程已创建。

SQL
> exec pro_test_readfrom_Osfile('USER_OBJECTS20090930.txt');


UTL_FILE包子过程说明:
utl_file方法
异常产生及处理:

utl_file异常

posted @ 2009-09-30 12:45  Mr.Myth  阅读(741)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3