Oracle
 sql >> Database >  >> RDS >> Oracle

Generazione iterativa XML PLSQL

Non ha senso tentare di generare XML molto grandi in PL/SQL. Il problema non è PL/SQL in quanto tale, ma PL/SQL supporta solo XML DOM e DOM non gestisce affatto bene XML di grandi dimensioni. Non dici quale dimensione del documento XML hai, ma non sarei sorpreso di scoprire che la memoria utilizzata da PL/SQL per creare il tuo documento è da 10 a 30 volte la dimensione del documento risultante.

Esiste un'opzione per generare l'XML utilizzando qualcosa di diverso da PL/SQL? In caso contrario, e dovessi davvero generare file XML di grandi dimensioni in un database Oracle, prenderei in considerazione l'utilizzo di procedure memorizzate Java. Questa domanda ha alcune risposte su come fare questo genere di cose in Java.

MODIFICA in risposta al tuo commento:il tuo codice non sta sicuramente scrivendo una riga alla volta. Sta scrivendo il lotto insieme, un fatto che ho verificato eseguendolo utilizzando la query SELECT * FROM all_objects sul mio database Oracle 11g XE. Il ciclo è stato eseguito una volta e ha scritto 7341 oggetti, creando un file XML di dimensioni di poco superiori a 3 MB.

Ho quindi provato a modificare il codice per supportare meglio l'approccio "incrementale" che descrivi. Ciò ha comportato:

  • aggiunta di una riga dbms_xmlgen.setmaxrows(ctx, max_rows); per dire a DBMS_XMLGEN di generare solo 5 righe alla volta. Altrimenti tenta di generare il lotto in una volta sola.

  • modificando il codice in cima al WHILE passa a

    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
    
  • aggiungendo la prima di queste tre righe appena prima della fine del WHILE ciclo.

Ho quindi eseguito nuovamente il codice e ho potuto vederlo scrivere ogni batch di cinque righe nel file ogni volta. Tuttavia, c'è un piccolo problema con questo approccio, in quanto il file è stato sovrascritto ogni volta. Alla fine avevo un solo record nel file XML di output. Non riesco a immaginare che sarebbe quello che vuoi.

Il WRITETOCLOB , WRITETOBUFFER e WRITETOFILE metodi in DBMS_XMLDOM non alludere alla possibilità di aggiungere un file esistente e, ad essere onesti, non sono sorpreso che non lo facciano. Se potessi, finiresti con un XML non valido, poiché ci sarebbero più di un <?xml ... ?> dichiarazione nel file.

Confermo il mio precedente consiglio. Ogni volta che devi gestire XML di grandi dimensioni, in un database Oracle o altrove, usa SAX o StAX. Anche PL/SQL non supporta, quindi fai tutto ciò che devi fare nelle procedure memorizzate Java o fallo fuori dal database.