2014-02-26 3 views
0

에서 xml 파일을 생성하면 저장 프로 시저가 실행될 때 오류가 발생합니다. 여기에 몇 가지 특수 문자 관련 문제는, 그래서 ORA-29285: file write errorORA-31061: XDB error: special char to escaped char conversion failed했다 당신이 이전에 언급 된 같은 문자 변환 오류가 아닌 여기에 XML 파일, generate XML from oracle tables오라클 테이블

Connecting to the database DB_old. 
ORA-29285: file write error 
ORA-06512: at "SYS.UTL_FILE", line 148 
ORA-06512: at "SYS.UTL_FILE", line 889 
ORA-06512: at "DBO_17FEB.EXPOR1", line 60 
ORA-06512: at line 6 
Process exited. 
Disconnecting from the database DB_old. 



------------------- 



create or replace 
PROCEDURE Expor1 
(
    V_TABLE_NAME IN varchar2 
) 
AS 
BEGIN 
     ----- Export table data 
     DECLARE 
     v_file UTL_FILE.file_type; 
     qryCtx DBMS_XMLGEN.ctxHandle; 
     result CLOB; 
     result1 CLOB; 
     v_FILENAME varchar2(30); 
     BEGIN 

     IF UPPER(V_TABLE_NAME) = 'PROJECT' THEN 
     qryCtx := dbms_xmlgen.newContext ('SELECT * from '||V_TABLE_NAME ||''); 

     ELSIF UPPER(V_TABLE_NAME) = 'LOGFILE' THEN 

     qryCtx := dbms_xmlgen.newContext ('select LOG_ID, USER_ID,RUN_DATE,PROCESS,MPOID,MODE_,trim(STATUS) as STATUS, 
               trim(regexp_replace(unistr(NOTES), ''[[:punct:]] '','''')) as NOTES, 
               MARKDELETED from logfile where rownum<100 '); 

     ELSE 
     qryCtx := dbms_xmlgen.newContext ('SELECT * from '||V_TABLE_NAME ||''); 
     END IF; 


     v_FILENAME :=V_TABLE_NAME; 
     DBMS_XMLGEN.setMaxRows(qryCtx, 5); 
     v_file := UTL_FILE.fopen('MYXML', v_FILENAME || '.xml', 'W'); 
     UTL_FILE.put_line(v_file, '<XML><'||v_FILENAME||'></'||v_FILENAME||'> <RECORDS>'); 
     -- v_file := UTL_FILE.FOPEN('MYXML', v_FILENAME|| '.xml', 'R'); 

     LOOP 
     DBMS_XMLGEN.SETNULLHANDLING(qryCtx ,null); 
     DBMS_XMLGEN.setRowSetTag(qryCtx, 0); 
     DBMS_XMLGEN.setRowTag(qryCtx, 'RECORD'); 

     -- save the XML into the CLOB field 
     result := DBMS_XMLGEN.getXML(qryCtx); 
     --result := REPLACE(result, '<?xml version="1.0"?>','<XML><'||v_FILENAME||'>'||result1 ||'</'||v_FILENAME||'>'); 
     result := REPLACE(result, '<?xml version="1.0"?>',' '); 
     result := REPLACE(result, '<_x0030_>',' '); 
     result := REPLACE(result, '</_x0030_>',' '); 
     --result :=trim(result); 
     -- UTL_FILE.put_line(v_file, ''); 
     EXIT WHEN DBMS_XMLGEN.getNumRowsProcessed(qryCtx) = 0; 
      -- store the XML to a XML files 
     UTL_FILE.put_line(v_file, result); 
     --UTL_FILE.put_line(v_file, '</XML>'); 
     END LOOP; 
     UTL_FILE.put_line(v_file, '</RECORDS></XML>'); 
     UTL_FILE.FCLOSE(v_file); 

     END; 


END Expor1; 

i am not able to handle some special char like : &/; :/ . etc please help 
+0

표시된 오류는 현재 가지고있는 문제와 일치하지 않습니다. 나는 당신이 실제로'LOGFILE'을 호출 할 때 ORA-31061을 얻고 있다고 가정합니까? –

답변

0

같은 XML 형식을 생성하지 못할. 어떤 오류가 발생했는지는 분명하지 않습니다. 그것이 파일 1 인 경우 문자 변환은 관련이 없습니다.

내 코드에 대한 내 코드 버전을 실행할 때 더 작은 테이블에 대해서는 정상적으로 작동하며 result이 32k 문자보다 큰 경우 ORA-06502: PL/SQL: numeric or value error을 얻습니다. 또는 줄 바꿈없이 32k가 넘는 경우 ORA-29285입니다. clob 이상의 루핑을 잃어서 파일에 덩어리로 작성했습니다. 출력 큰 값으로, 내가 그랬던 것처럼 이전 :

position pls_integer := 1; 
chars pls_integer := 32767; 
... 
while position < dbms_lob.getlength(result) loop 
    utl_file.put(v_file, dbms_lob.substr(result, chars, position)); 
    utl_file.fflush(v_file); 
    position := position + chars; 
end loop; 

확실하지 당신은 프로 시저 내 내부 블록 (declare/begin /`끝 ') 이유.

ORA-31061이 발생하는 경우 어떤 데이터가 문제를 일으키는 지 아직 분명하지 않지만 NOTES 변환이 문제를 해결한다고 가정하고이를 전화 할 때 여전히 ORA-31061이 표시되고 있다고 가정합니다. LOGFILE 표가 표시되면 qryCtx을 재설정했기 때문일 수 있습니다.

 qryCtx := dbms_xmlgen.newContext ('select LOG_ID, 
     USER_ID,RUN_DATE,PROCESS,MPOID,MODE_,STATUS, 
     regexp_replace(unistr(NOTES), ''[[:punct:]]'','''') as NOTES, 
     MARKDELETED from logfile'); 

...하지만 당신이 것을 수행 if/elsif/else 블록 후, 당신은 다음 라인에 덮어 쓰기 :

당신은 코드 라인 23에서 당신은 같은 것으로 만드는 39과 : 당신이 다음 호출 할 때

 qryCtx := dbms_xmlgen.newContext ('SELECT * from '||V_TABLE_NAME ||''); 

그래서 getXML(qryCtx) 당신은 NOTES의 수정 된 값을 받고 있지 않습니다.

+0

이 줄을 주석으로 작성하십시오 qryCtx : = dbms_xmlgen.newContext ('SELECT * from'|| V_TABLE_NAME || ''); 그리고 "YNC 0094 : DB 테이블 프로젝트가 그 레코드가 없습니다 & = 1"과 같은 데이터를 찾았으므로이 "94 CTIPS 테이블 프로젝트는 해당 docyear chgoffcl1에 대한 레코드가 없습니다"함수를 사용하여 " regexp_replace (unistr()) " –

+0

@hardikrawal -이 문자열의 특수 문자는 파일에서 '<'등으로 변환됩니다. 나는 그 데이터를 혼자서 또는'regexp_replace()'로 남겨 두거나 에러를 보지 못했다. 실제로 어떤 오류가 발생 했습니까? 'ORA-29285'를 얻는다면 문자 변환과 관련이 없습니다. 한번에 쓰려고하는 데이터의 양입니다. –

+0

예, 동일한 저장 프로 시저에 대해 해결하는 방법 현재 데이터베이스 오류 CTIPS_old에 연결하는 동안 오류가 발생했습니다. ORA-29285 : 파일 쓰기 오류 ORA-06512 "SYS.UTL_FILE"에서, 라인 (148) ORA-06512 "DBO_CTIPS17FEB.EXPOR1"에서, 선 51 : "SYS.UTL_FILE"라인 889 ORA-06,512에서 ORA-06512 : 6 호선에서 프로세스가 종료되었습니다. 데이터베이스 CTIPS_old에서 연결을 끊습니다. –