Plsql pl/sql utl\u文件的结尾总是\r\n

Plsql pl/sql utl\u文件的结尾总是\r\n,plsql,oracle11g,Plsql,Oracle11g,我已经在Oracle11gdb上用pl/sql编写了一个函数,用于导出遵循特定细节的表。其中一个细节是\n as换行符 PROCEDURE exportTableAScsv (p_tname varchar2) IS fileHandler UTL_FILE.FILE_TYPE; l_theCursor integer default dbms_sql.open_cursor; l_columnValue varchar2(4000); l_s

我已经在Oracle11gdb上用pl/sql编写了一个函数,用于导出遵循特定细节的表。其中一个细节是\n as换行符

PROCEDURE exportTableAScsv (p_tname varchar2) IS
    fileHandler     UTL_FILE.FILE_TYPE;
    l_theCursor     integer default dbms_sql.open_cursor;
    l_columnValue   varchar2(4000);
    l_status        integer;
    l_query         varchar2(1000) default 'select * from ' || p_tname;

    l_colCnt        number := 0;
    l_separator     varchar2(1) default '|';
    l_descTbl       dbms_sql.desc_tab;
    test_n          number:=0;
    filename        varchar2(100) := 'custom_export_'|| p_tname ||'_' ||    to_char(sysdate,'yyyymmddhhmmss')|| '.csv';
    ex_custom EXCEPTION;
    PRAGMA EXCEPTION_INIT( ex_custom, -20001 );

 BEGIN

 fileHandler := UTL_FILE.FOPEN('TEMPDIR', filename , 'W');
 dbms_sql.parse(  l_theCursor,  l_query, dbms_sql.native );
 dbms_sql.describe_columns( l_theCursor, l_colCnt, l_descTbl );
 . . .

 for i in 1 .. l_colCnt loop
     if (i>1) then
         UTL_FILE.put( fileHandler, l_separator || l_descTbl(i).col_name );
     else
         UTL_FILE.put( fileHandler, l_descTbl(i).col_name );
     end if;
     dbms_sql.define_column( l_theCursor, i, l_columnValue, 4000 );
 end loop;
 -- UTL_FILE.put_line(fileHandler,'')
 UTL_FILE.fflush(fileHandler)
 UTL_FILE.put( fileHandler, CHR(10) );

 l_status := dbms_sql.execute(l_theCursor);
 . . . 
 while ( SYS.dbms_sql.fetch_rows(l_theCursor) > 0 ) loop
     for i in 1 .. l_colCnt loop
         SYS.dbms_sql.column_value( l_theCursor, i, l_columnValue );
         if (i > 1) then
            utl_file.put( fileHandler, l_separator || l_columnValue );
         else
            utl_file.put( fileHandler, l_columnValue );
         end if;
     end loop;
    -- UTL_FILE.put_line(fileHandler,'')
    UTL_FILE.fflush(fileHandler)
    UTL_FILE.put( fileHandler, CHR(10) );
  end loop;

  dbms_sql.close_cursor(l_theCursor);
  UTL_FILE.FCLOSE(fileHandler);
EXCEPTION
 . . .
 UTL_FILE.FCLOSE(fileHandler);
 raise;
. . . 
END exportTableAScsv;
如标题中所述,尽管有上述代码,但在运行函数时,我总是以windows格式提取数据,\r\n作为行的结尾。 Oracle数据库位于windows计算机上。
另外,不幸的是,我不能将db放在linux机器上,而使用put_行。

我怀疑这是由于您使用UTL_FILE.FFLUSH造成的。引用(我的重点):

FFLUSH将挂起的数据物理写入 文件句柄。通常,写入文件的数据是缓冲的。这个 FFLUSH过程强制将缓冲数据写入文件。 数据必须以换行符结尾。

但是,在函数中,在使用PUT追加换行符之前调用FFLUSH。由于您在Windows框中,因此您将获得Windows新行字符


略为旁白;为什么这是一个函数而不是一个过程?作为一个过程,它更有意义,因为您不希望人们能够从SQL调用它。

毫无疑问,您有一个非常好的理由编写自己的UTILITY,而不是使用Oracle的内置数据泵?不仅是一个函数,而且是一个总是返回1的函数。因此,与巧克力茶壶和鱼自行车一样,它的实用范围也很广;它还可能返回0或2,以便在其他地方解码(我猜)。这是毫无意义的;这种操作要么失败,要么成功,而且肯定不应该在SQL中使用,所以将其设置为过程并返回布尔值;耸耸肩。有多个返回点的函数是我的另一个问题!