필자는 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을 사용할 수 없다.
오라클의 내장형 Data Pump를 사용하는 대신 자신 만의 글을 쓸 수있는 좋은 이유가 있을까요? – APC