将ORACLE的任意表数据导出(标准格式)

本文介绍了一个用于将Oracle数据库中的表数据导出到指定路径下文件的存储过程。该过程支持不同的导出方式(如追加或覆盖),并能自动生成文件名或使用用户提供的名称。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
create   or   replace   procedure   backup_table_to_file     /*功能:将ORACLE的任意表数据导出(标准格式)   */   
  (   
  v_tablename 
varchar2/*需要导出的表名*/   
  v_path 
varchar2/*服务器上导出数据文件的目录*/   
  v_string 
varchar2/*服务器上导出数据文件的文件名*/   
  v_where 
varchar2/*查询条件*/   
  v_flag 
varchar2,   /*写数据文件的方式   w:重写 a:追加*/   
  outflag   out   
varchar2         /*返回处理结果   0   成果、1   写入目录有误、2   表名有误、3   写入目录不能为空、4   写入文件方式有误、5   查询条件有误、6   其他错误*/   
  )   
  
is   
  file_handle   utl_file.file_type;   
  path_notinput_exception   EXCEPTION;   
  table_notfind_exception   EXCEPTION;   
  write_type_exception   EXCEPTION;   
  type   ref_cursor_type   
is   REF   CURSOR;   
  cursor_select   ref_cursor_type;   
  outputline   
varchar2(1000)   ;   
  select_cname   
varchar2(1000)   ;   
  w_flag   
varchar2(10);   
  get_cname   
varchar2(1000)   ;   
  put_cname   
varchar2(1000)   ;   
  
temp   varchar2(1000)   ;   
  resault   
varchar2(1000)   ;   
  filepath   
varchar2(100)   ;   
  filename   
varchar2(100)   ;   
  i   
integer;   
  
begin   
  outflag   :
='0';   
  
IF   (v_path   is   null)   THEN           --初始化服务器文件夹   
  RAISE   path_notinput_exception;   
  
ELSE   
  filepath   :
=   rtrim(trim(v_path),'/');   
  
END   IF;                                             --初始化服务器文件夹   
  get_cname   :=   '';   
  
temp   :=   nls_upper(v_tablename);   
  
if   (v_flag   is   null)   then         --初始化写文件方式   
  w_flag   :=   'w';   
  
else   
  w_flag   :
=   v_flag;   
  
end   if;                                           --初始化写文件方式   
  if   w_flag   in   ('W','w','A','a')   then   
  select_cname   :
=   'select   cname   from   col   where   tname   =   '||''''||temp||'''';   
  
OPEN   cursor_select   for   select_cname;   
  
FETCH   cursor_select   into   get_cname;   
  
IF   (get_cname   is   null)   THEN   
  RAISE   table_notfind_exception;   
  
END   IF;   
  put_cname   :
=   ''''||'"'||''''||'||'||get_cname||'||'||''''||'"'||'''';   
  
WHILE   cursor_select%FOUND   LOOP   
  
FETCH   cursor_select   into   get_cname;   
  
EXIT   WHEN   cursor_select%NOTFOUND;   
  put_cname   :
=put_cname   ||'||'||''''||','||''''||'||'||''''||'"'||''''||'||'||get_cname||'||'||''''||'"'||'''';   
  
END   LOOP;   
  
CLOSE   cursor_select;   
  
IF   (v_string   is   null)   then   
  select_cname   :
=   'select   to_char(sysdate,'||''''||'yyyymmdd'||''''||')   from   DUAL';   
  
OPEN   cursor_select   for   select_cname;   
  
FETCH   cursor_select   into   filename;   
  
CLOSE   cursor_select;   
  filename   :
=   v_tablename||'.'||filename||'.txt';   
  
ELSE   
  filename   :
=   v_string;   
  
END   IF;   
        file_handle   :
=utl_file.fopen(filepath,filename,w_flag);   
                  select_cname   :
=   'select   '||put_cname||'   from   '||temp||'   '||v_where;   
                  resault   :
=   '';   
                  
OPEN   cursor_select   for   select_cname;   
  
FETCH   cursor_select   into   resault;   
  
WHILE   cursor_select%FOUND   LOOP   
  outputline   :
=   resault;   
          utl_file.put_line(file_handle,outputline);   
  
FETCH   cursor_select   into   resault;   
  
END   LOOP;   
  
CLOSE   cursor_select;   
  utl_file.fclose(file_handle);   
  
ELSE   
  RAISE   write_type_exception;   
  
end   if;   
  exception   
  
when   utl_file.invalid_path   then   
  outflag   :
='1';   
  
--raise_application_error(-20001,'错误:主机的写入文件目录有误!');   
  when   table_notfind_exception   then   
  outflag   :
='2';   
  
--raise_application_error(-20002,'错误:输入的表名有误!');   
          when   path_notinput_exception   then   
          outflag   :
='3';   
  
--raise_application_error(-20003,'错误:服务器的写入文件目录为必输项!');   
  when   write_type_exception   then   
          outflag   :
='4';   
  
--raise_application_error(-20004,'错误:写入文件方式有误!');   
  when   others   then   
  
if   sqlcode   like   '-9%'   then   
  outflag   :
='5';   
  
--raise_application_error(-20005,'错误:查询条件有误!');   
  else   
  outflag   :
='6';   
  raise_application_error(sqlcode,sqlerrm);   
  
end   if;   
  
end   backup_table_to_file;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值