Oracle
 sql >> база данни >  >> RDS >> Oracle

Генериране на XML PLSQL итерация

Няма смисъл да се опитвате да генерирате много голям XML в PL/SQL. Проблемът не е PL/SQL като такъв, а че PL/SQL поддържа само XML DOM, а DOM изобщо не се справя добре с голям XML. Не казвате какъв размер на XML документ имате, но няма да се изненадам да открия, че паметта, използвана от PL/SQL за изграждане на вашия документ, е около 10 до 30 пъти по-голяма от размера на получения документ.

Има ли опция за генериране на XML с помощта на нещо различно от PL/SQL? Ако не, и наистина трябваше да генерирам големи XML файлове в база данни на Oracle, бих обмислил използването на съхранени процедури на Java. Този въпрос има някои отговори как да правите подобни неща в Java.

РЕДАКТИРАНЕ в отговор на вашия коментар:вашият код определено не пише ред по ред. Пише партидата заедно, факт, който проверих, като го стартирах с помощта на заявката SELECT * FROM all_objects в моята база данни Oracle 11g XE. Цикълът се изпълнява веднъж и записва 7341 обекта, създавайки XML файл с размер малко над 3 MB.

След това се опитах да модифицирам вашия код, за да поддържам по-добре „инкременталния“ подход, който описвате. Това включваше:

  • добавяне на ред dbms_xmlgen.setmaxrows(ctx, max_rows); за да кажете на DBMS_XMLGEN да генерира само 5 реда наведнъж. В противен случай се опитва да генерира партидата наведнъж.

  • модифициране на кода в горната част на WHILE цикъл към

    xml_result := dbms_xmlgen.getXML(ctx);
    num_rows_processed := DBMS_XMLGEN.GETNUMROWSPROCESSED(ctx);
    dbms_output.put_line('Got ' || num_rows_processed || ' rows processed');
    
    while num_rows_processed > 0
      -- rest of loop omitted
    
  • добавяйки първия от тези три реда точно преди долната част на WHILE цикъл.

След това стартирах отново вашия код и можех да го видя да записва всяка партида от пет реда във файла всеки път. Има обаче малък проблем с този подход, тъй като файлът се презаписва всеки път. В крайна сметка имах само един запис в изходния XML файл. Не мога да си представя, че това ще е това, което искате.

WRITETOCLOB , WRITETOBUFFER и WRITETOFILE методи в DBMS_XMLDOM не намекват за възможността за добавяне към съществуващ файл и, честно казано, не съм изненадан, че не го правят. Ако можехте, щяхте да получите невалиден XML, тъй като щеше да има повече от един <?xml ... ?> декларация във файла.

Поддържам предишния си съвет. Винаги, когато трябва да работите с голям XML, в база данни на Oracle или другаде, използвайте SAX или StAX. PL/SQL не поддържа нито едното, така че направете каквото трябва в съхранените процедури на Java или го направете извън базата данни.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle изберете взаимен под низ

  2. Oracle SQL за сортиране на номерата на версиите

  3. Oracle - Как да получа действителния размер на конкретен РОД?

  4. Oracle:Замяна на нечислови знаци в низ

  5. Свиване на записи за дати само ако стойността не се променя - Oracle SQL