sql >> Base de Datos >  >> RDS >> Oracle

Generación iterativa de XML PLSQL

No tiene sentido intentar generar XML muy grande en PL/SQL. El problema no es PL/SQL como tal, sino que PL/SQL solo admite XML DOM, y DOM no maneja bien XML grande. No dice qué tamaño de documento XML tiene, pero no me sorprendería encontrar que la memoria utilizada por PL/SQL para construir su documento es de 10 a 30 veces el tamaño del documento resultante.

¿Hay alguna opción para generar el XML usando algo que no sea PL/SQL? Si no, y realmente tuve que generar archivos XML grandes en una base de datos Oracle, consideraría usar procedimientos almacenados de Java. Esta pregunta tiene algunas respuestas sobre cómo hacer este tipo de cosas en Java.

EDITAR en respuesta a su comentario:su código definitivamente no está escribiendo una línea a la vez. Está escribiendo todo junto, un hecho que verifiqué al ejecutarlo usando la consulta SELECT * FROM all_objects en mi base de datos Oracle 11g XE. El ciclo se ejecutó una vez y escribió 7341 objetos, creando un archivo XML de poco más de 3 MB de tamaño.

Luego intenté modificar su código para admitir mejor el enfoque 'incremental' que describe. Esto involucró:

  • agregando una línea dbms_xmlgen.setmaxrows(ctx, max_rows); para decirle a DBMS_XMLGEN que solo genere 5 filas a la vez. De lo contrario, intenta generar el lote de una sola vez.

  • modificando el código en la parte superior de WHILE bucle 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
    
  • agregando la primera de estas tres líneas justo antes de la parte inferior de WHILE bucle.

Luego volví a ejecutar su código y pude verlo escribiendo cada lote de cinco filas en el archivo cada vez. Sin embargo, hay un pequeño problema con este enfoque, ya que el archivo se sobrescribió cada vez. Al final solo tenía un único registro en el archivo XML de salida. No puedo imaginar que esto sea lo que quieres.

El WRITETOCLOB , WRITETOBUFFER y WRITETOFILE métodos en DBMS_XMLDOM no insinúe la capacidad de agregar a un archivo existente y, para ser honesto, no me sorprende que no lo hagan. Si pudiera, terminaría con un XML no válido, ya que habría más de un <?xml ... ?> declaración en el expediente.

Mantengo mi consejo anterior. Siempre que necesite manejar XML de gran tamaño, en una base de datos Oracle o en otro lugar, use SAX o StAX. PL/SQL tampoco es compatible, así que haga lo que necesite en los procedimientos almacenados de Java o hágalo fuera de la base de datos.