2014-02-26 58 views
0

然後顯示錯誤。這裏的一些特殊字符有關的問題,所以我不能生成xml文件,這裏XML格式相同generate XML from oracle tables當我在存儲過程下運行時,從oracle表生成xml文件

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

ORA-29285: file write error是不是你之前提到的相同的字符轉換錯誤,這是ORA-31061: XDB error: special char to escaped char conversion failed。真的不清楚你遇到了哪個錯誤;如果它是文件,則字符轉換不相關。

當我將我的代碼版本對我的表運行時,對於較小的表可以正常工作,並且如果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

你正在創建一個在代碼中的第23行如您所提供:

 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塊,你做到這一點後,你再以線覆蓋它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:數據庫表項目沒有該記錄 = 1」的數據,因此我將它替換爲此「94 CTIPS表項目沒有記錄對於該文檔年份chgoffcl1」通過使用函數「 regexp_replace(unistr())「 –

+0

@hardikrawal - 無論如何,該字符串中的特殊字符將被轉換爲」<「等。我沒有看到該數據的錯誤,無論是單獨放置還是使用'regexp_replace()'。你現在真的得到哪個錯誤?如果你獲得'ORA-29285',那麼它與字符轉換無關,它是你一次試圖寫出的數據量。 –

+0

是的,如何解決它對於同一個存儲過程當前我正面臨以下錯誤連接到數據庫CTIPS_old。 ORA-29285:文件寫入錯誤 ORA-06512:在 「SYS.UTL_FILE」,線148 ORA-06512:在 「SYS.UTL_FILE」,線路889 ORA-06512:在 「DBO_CTIPS17FEB.EXPOR1」,第51行 ORA-06512:在第6行 進程已退出。 從數據庫CTIPS_old斷開連接。 –