2017-11-29 3 views
1

Oracle Oracle DB에 값 메트로 열이 있습니다. utl_file 패키지를 사용하여 CSV 파일에 기록합니다.이 값에는 특수 문자가 있기 때문에 변환 기능을 사용하여 쓰는 동안 정크 문자를 제거하도록 문자 코딩을 변경했습니다. 따라서 변환 함수는 다음과 같습니다. convert (REC.DT25, 'WE8DEC'). 그러나 문제는 그 가치가 단지 메론 (Méron)으로오고 마지막 문자가 빠져 있다는 것입니다. 나는 그것을 다른 문자 인코딩으로 변경하는 것에서부터 모든 것을 시도했지만 여전히 운이 없다. 도와 주실 수 있겠습니까? 만들거나 문제를 재현 12.2 AL32UTF8 데이터베이스에 다음 스크립트를 실행Oracle에서 특수 문자가 두 번 반복되지 않습니다.

CREATE OR REPLACE PROCEDURE SAMPLE_MERONE AS 

CURSOR C1 IS select * from gsal_mosaic_prf_output where CS46SIGFORMALNAME 
LIKE 'Lt. Jowens Méroné' AND ID_NUMBER='8-13678728'; 

MERONE_FILE UTL_FILE.FILE_TYPE; 
V_MERONE_FILE VARCHAR2(300); 

BEGIN 
V_MERONE_FILE := 'MREONE_FILE.csv'; 
MERONE_FILE := UTL_FILE.FOPEN ('GSAL_PRF',V_MERONE_FILE,'w',32767) ; 
IF UTL_FILE.IS_OPEN(MERONE_FILE) THEN 
FOR REC IN C1 
LOOP 
UTL_FILE.PUT_LINE(MERONE_FILE,'"'||REC.ID_NUMBER||'","'|| 
REC.GROUP_ID||'","'||convert(REC.CS46LASTNAME,'WE8ISO8859P1', 
'UTF8')||'","'|| 
convert(REC.CS46SIGFORMALNAME,'WE8ISO8859P1', 
'UTF8')||'"',TRUE); 
END LOOP; 
UTL_FILE.FCLOSE (MERONE_FILE) ; 
END IF; 
END SAMPLE_MERONE; 
+0

확인이 개 문자는 같은 바이트 값이있는 경우 귀하의 칼럼에. 테이블에서 덤프 (열)를 선택하십시오. 또한 데이터베이스 문자 집합에서 해당 문자를 인코딩 할 올바른 바이트 값이 있어야합니다. – Rene

+0

데이터베이스 문자 집합은 무엇입니까? 'UTL_FILE'을 사용하는 코드를 보여주십시오. –

+0

데이터베이스 문자 집합이 'UTF-8'입니다. –

답변

0

AS 절차 SAMPLE_MERONE 교체 다음과 같이 코드입니다.

declare 

    cursor c1 is 
     select lastname 
      ,convert(lastname, 'WE8ISO8859P1','UTF8') convertedname 
      ,dump(convert(lastname, 'WE8ISO8859P1','UTF8')) dumpconvertedname 
     from (select 'Lt. Jowens Méroné' as lastname 
       from dual); 

    merone_file utl_file.file_type; 
    v_merone_file varchar2(300); 

begin 
    merone_file := utl_file.fopen('NGM1_PAD_IN', 'test.csv', 'w', 32767); 
    if utl_file.is_open(merone_file) 
    then 
     for rec in c1 
     loop 
     dbms_output.put_line(rec.lastname ||' - ' ||rec.convertedname);  
     dbms_output.put_line(rec.dumpconvertedname); 
     utl_file.put_line(merone_file 
          ,rec.lastname || '","' || 
          rec.convertedname || '"' 
          ,true); 
     end loop; 
     utl_file.fclose(merone_file); 
    end if; 
end; 
/

화면 출력 :

중위 Jowens MA ©로나 © - 중위 Jowens 메론

통상 렌 = 1 = 17 : 76,116,46,32,74,111,119,1011101153277233114111110,233

파일 내용 :

중위 Jowens Móon ""Lt. Jowens 메론 "

변환 문자 (233)에 195 169을 변경 당신은 변환 된 문자열의 마지막 문자로 볼 수 있습니다. 그러나 어떻게 든이이 파일에 방법입니다하지 않습니다.

헥스으로 파일을 탐색 편집기이를 확인합니다. 당신이 CLOB에 모든 데이터를 조립하고 다음과 같이 쓸 수있는 해결 방법으로

.이 올바르게 데이터를 변환하는 것 같다.

declare 

    l_clob clob; 
    l_string varchar2(32767); 

    cursor c1 is 
     select lastname 
     from (select 'Lt. Jowens Méroné' as lastname 
       from dual); 

begin 

    dbms_lob.createtemporary(lob_loc => l_clob, cache => true, dur => dbms_lob.call); 
    dbms_lob.open(lob_loc => l_clob, open_mode => dbms_lob.lob_readwrite); 

    for rec in c1 
    loop 
     l_string := rec.lastname || '","' || rec.lastname || '"' || chr(13) || chr(10); 
     dbms_lob.writeappend(lob_loc => l_clob, amount => length(l_string), buffer => l_string); 

    end loop; 

    dbms_xslprocessor.clob2file(flocation => 'NGM1_PAD_IN' 
           ,fname  => 'test2.csv' 
           ,cl  => l_clob 
           ,csid  => nls_charset_id('WE8ISO8859P1')); 

end; 
/
관련 문제