Det nytter ikke at forsøge at generere meget stor XML i PL/SQL. Problemet er ikke PL/SQL som sådan, men at PL/SQL kun understøtter XML DOM, og DOM håndterer stort XML overhovedet ikke godt. Du siger ikke, hvilken størrelse XML-dokument du har, men jeg ville ikke blive overrasket over at finde ud af, at den hukommelse, der bruges af PL/SQL til at bygge dit dokument, er omkring 10 til 30 gange størrelsen af det resulterende dokument.
Er der en mulighed for at generere XML ved hjælp af noget andet end PL/SQL? Hvis ikke, og jeg virkelig skulle generere store XML-filer i en Oracle-database, ville jeg overveje at bruge lagrede Java-procedurer. Dette spørgsmål har nogle svar på, hvordan man gør denne slags ting i Java.
REDIGER som svar på din kommentar:din kode skriver absolut ikke en linje ad gangen. Det skriver partiet sammen, et faktum, jeg bekræftede ved at køre det ved hjælp af forespørgslen SELECT * FROM all_objects
på min Oracle 11g XE-database. Sløjfen kørte én gang og skrev 7341 objekter, hvilket skabte en XML-fil på lidt over 3 MB.
Jeg prøvede derefter at ændre din kode for bedre at understøtte den 'inkrementelle' tilgang, du beskriver. Dette involverede:
-
tilføjelse af en linje
dbms_xmlgen.setmaxrows(ctx, max_rows);
at fortælle DBMS_XMLGEN kun at generere 5 rækker ad gangen. Ellers forsøger den at generere partiet på én gang. -
ændring af koden øverst i
WHILE
sløjfe tilxml_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
-
tilføjer den første af disse tre linjer lige før bunden af
WHILE
løkke.
Jeg kørte derefter din kode igen, og jeg kunne se, at den skrev hver batch på fem rækker til filen hver gang. Der er dog et lille problem med denne tilgang, idet filen blev overskrevet hver gang. Til sidst havde jeg kun en enkelt post i output XML-filen. Jeg kan ikke forestille mig, at det er det, du ønsker.
WRITETOCLOB
, WRITETOBUFFER
og WRITETOFILE
metoder i DBMS_XMLDOM
antyd ikke muligheden for at tilføje til en eksisterende fil, og for at være ærlig er jeg ikke overrasket over, at de ikke gør det. Hvis du kunne, ville du ende med ugyldig XML, da der ville være mere end én <?xml ... ?>
erklæring i filen.
Jeg står ved mit tidligere råd. Når du har brug for at håndtere stor XML, i en Oracle-database eller andre steder, så brug SAX eller StAX. PL/SQL understøtter heller ikke, så gør hvad end du skal gøre i lagrede Java-procedurer, eller gør det ud af databasen.