我的sqlplus连的是服务器,执行服务器上的存储过程(把数据库数据导出到txt文件中),它生成的文件不在本机,却在服务器上。存储过程代码是:create or replace function dump_csv( p_query     in varchar2, //sql语句
                                      p_separator in varchar2, //字段以什么间隔
                                      p_dir       in varchar2 , //地址
                                      p_filename  in varchar2 ) //导出的文件名
return number
AUTHID CURRENT_USER
is
    l_output        utl_file.file_type;
    l_theCursor     integer default dbms_sql.open_cursor;
    l_columnValue   varchar2(2000);
    l_status        integer;
    l_colCnt        number default 0;
    l_separator     varchar2(10) default '';
    l_cnt           number default 0;
begin
    l_output := utl_file.fopen(p_dir, p_filename, 'w' );    dbms_sql.parse(  l_theCursor,  p_query, dbms_sql.native );    for i in 1 .. 255 loop
        begin
            dbms_sql.define_column( l_theCursor, i,
                                    l_columnValue, 2000 );
            l_colCnt := i;
        exception
            when others then
                if ( sqlcode = -1007 ) then exit;
                else
                    raise;
                end if;
        end;
    end loop;    dbms_sql.define_column( l_theCursor, 1, l_columnValue,
                            2000 );    l_status := dbms_sql.execute(l_theCursor);    loop
        exit when ( dbms_sql.fetch_rows(l_theCursor) <= 0 );
        l_separator := '';
        for i in 1 .. l_colCnt loop
            dbms_sql.column_value( l_theCursor, i,
                                   l_columnValue );
            utl_file.put( l_output, l_separator ||
                                    l_columnValue );
            l_separator := p_separator;
        end loop;
        utl_file.new_line( l_output );
        l_cnt := l_cnt+1;
    end loop;
    dbms_sql.close_cursor(l_theCursor);    utl_file.fclose( l_output );
    return l_cnt;
end dump_csv;
大哥,大姐帮帮忙。小弟谢过了。

解决方案 »

  1.   

    utl_file打开的是基于directory的路径,directory指向的路径肯定是服务器本地的地址用pl/sql developer工具很容易实现你的需求,tools菜单里
      

  2.   

    嗯,我也知道通过tools里的工具导出,但是项目要求是通过代码操作的,ls有没有办法改变它的地址,传递到本地。
      

  3.   

    你就等于把服务器上的数据直接写到客户端~  代码不知道怎么实现,关注下其实你可以先写到服务器端,然后写个ftp的脚本,把生成好的文本下载到本地
      

  4.   

    directory是建在服务器上,所以生产的文件也都是保存在服务器上。
      

  5.   

    生成的文件必然是在服务器上的,只能通过 hanzs 说的这种变通的方式 来实现你的需求
      

  6.   

    DECLARE
      V_FILE UTL_FILE.FILE_TYPE;
      L_TXT  VARCHAR2(32767);
    BEGIN
      --1.这种保存在服务器,参数1为虚拟路径。参数2保存文件名,参数3 覆盖
      UTL_FILE.PUT_LINE(V_FILE, L_TXT);  V_FILE := UTL_FILE.FOPEN('CUX_FILE_PATH', 'TTTT.txt', 'w');  IF UTL_FILE.IS_OPEN(V_FILE) THEN
        UTL_FILE.FCLOSE(V_FILE);
      END IF;
      
      --2.跑报表时,点击【查看输出】按钮 可以下载的。
      Fnd_File.Put_Line(Fnd_File.Output,L_TXT);
    END;
    你要哪一种的?