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;

解决方案 »

  1.   

    以上是一个存储过程的源码,可以用来备份一个表到文件中。
    你在java里调用存储过程即可。
    如果要备份所有的表,可以用select unique tname from col;查出当前用户所有表名。
    然后逐一调用存储过程即可。
      

  2.   

    其实也就是java中如何执行一个应用程序。
      

  3.   

    实在是比较麻烦。不如在java中执行一个批处理。
      

  4.   

    最好不要有这种在程序中备份oracle数据库的想法。
    oracle不是access。