2013-01-28 2 views
0

필자는 particolar 세부 사항을 따르는 테이블을 내보내려면 oracle 11g db에서 pl/sql 함수를 작성했습니다. 그 중 하나는 브레이크 라인으로 \ n입니다.pl/sql utl_file endline은 항상 r n

위의 코드에도 불구하고, 제목에 언급 한 바와 같이
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; 

, 나는 항상 데이터가 행의 끝으로 \ r에 \ n 인 창 형식으로 추출 얻을 기능을 실행할 때. Oracle DB는 Windows 시스템에 있습니다. 오후 8시 30 분 P.S. 불행히도 나는 리눅스 박스에 DB를 넣고 대신 put_line을 사용할 수 없다.

+0

오라클의 내장형 Data Pump를 사용하는 대신 자신 만의 글을 쓸 수있는 좋은 이유가 있을까요? – APC

답변

1

이것이 UTL_FILE.FFLUSH 사용으로 인한 것 같습니다. the documentation (내 강조)에서 인용 :

FFLUSH 물리적으로 파일 핸들에 의해 식별 된 파일에 계류중인 데이터를 기록합니다. 일반적으로 파일에 기록되는 데이터는 버퍼링됩니다. FFLUSH 프로시 저는 버퍼에 저장된 데이터를 강제로 파일에 기록합니다. 데이터는 개행 문자로 끝나야합니다. 그러나, 당신이 줄 바꿈을 추가 할 PUT을 사용 전에 FFLUSH 를 호출하고 함수에서

. Windows 상자에서 작업 할 때 Windows 줄 바꿈 문자가 표시됩니다.

조금 따로; 왜이 기능과 절차가 아닌가요? 사람들이 SQL에서 이것을 호출 할 수 없기 때문에 프로 시저로서 더 이해할 수 있습니다.

+0

함수가 아니라 항상 1을 반환하는 함수입니다. 따라서 초콜릿 주전자 및 피크닉 자전거와 동일한 유틸리티 범위에 있습니다. – APC

+0

@APC에는 몇 개의 "snips"가 있습니다. 그것은 또한 다른 곳에서 디코딩 될 0 또는 2를 반환 할 수도 있습니다 (아마도). 그것은 단지 무의미하다. 이러한 종류의 작업은 실패 또는 성공 중 하나이며 SQL에서 사용해서는 안됩니다. 따라서 프로 시저로 만들고 부울을 반환하십시오. * 어깨를 으.합니다. – Ben

+0

둘 이상의 RETURN 포인트가있는 함수가 버그 베어 중 하나입니다! – APC