【问题标题】:generate xml file from oracle table从 oracle 表生成 xml 文件
【发布时间】:2014-03-29 07:22:36
【问题描述】:

当我在存储过程下方运行时,它会显示错误。这里有一些特殊的字符相关问题,所以我不能生成xml文件,这里的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

【问题讨论】:

  • 您显示的错误与您所说的问题不符;我假设你实际上仍然得到 ORA-31061,当你打电话给 LOGFILE?

标签: xml oracle oracle11g xml-serialization plsqldeveloper


【解决方案1】:

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;或 ORA-29285 如果有超过 32k 没有换行符。您已经失去了对 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/`end')。

如果您收到 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 的修改值。

【讨论】:

  • 请评论这一行 qryCtx := dbms_xmlgen.newContext ('SELECT * from '||V_TABLE_NAME ||'' );我发现像“YNC 0094:DB 表项目没有该 =1 的记录”这样的数据,所以我将其替换为“94 CTIPS 表项目没有该 docyear chgoffcl1 的记录”通过使用函数“regexp_replace(unistr())”
  • @hardikrawal - 该字符串中的特殊字符无论如何都会在文件中转换为&amp;lt; 等。我没有看到该数据有错误,不管是不管它还是你的regexp_replace()。您现在实际上遇到了哪个错误?如果您收到ORA-29285,则与字符转换无关,而是您尝试一次写出的数据量。
  • 是的,如何为相同的存储过程解决它目前我面临以下错误连接到数据库 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 断开连接。
  • @hardikrawal - 我已经在这个答案中说过,您需要将结果以块的形式写入文件,我已经在此处和之前的回答。 ORA-29285 来自于尝试在一个utl_file.put 中写入超过 32k。循环执行,使用fflush
  • 您好,感谢您的回复,但我仍然无法解决这个问题,我已经为此制作了一个新的存储程序,请检查它,我将如何解决它。 stackoverflow.com/questions/22060483/…
猜你喜欢
  • 2014-06-14
  • 2014-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 2013-01-06
相关资源
最近更新 更多