Oracle 9.2.0.6i Transformation von Abfragen ins XML Format

tplanitz

Erfahrenes Mitglied
Hallo Leute,

habe mich heute mal hingesetzt und möchte folgendes mit beitragen, hoffe das das Thema noch mehr Leute interessiert. Kann mir jemand genau erklären was die Funktion: DBMS_XMLGEN.setMaxRows(queryContext, 4); genau macht, das habe ich nur intuitiv geschrieben und es funktioniert aber ist mir nicht wirklich klar.

Problemstellung
============

  • Frage: kann Oracle 9i Ergebnisse aus Select Abfragen direkt in XML 1.0 umwandeln
  • Antwort: ja

Loesung
======

  • In dem unten angehangenen Sourcen wird eine Tabelle "Auto" kreiert, Datensätze eingetragen und eine 'dummy' Tabelle zur aufnahme der Objecte gebaut.
  • Als nächstes folgt die Prozedur die dann die Transformation vornimmt.
  • Kann mir jemand genau erklären was die Funktion: DBMS_XMLGEN.setMaxRows(queryContext, 4); genau macht, das habe ich nur intuitiv geschrieben und es funktioniert aber ist mir nicht wirklich klar.
Hoffe auf ne Antwort

So hier die Quellen wer es probiert sollte nur SQL Plus verwenden, leider hab ich es nicht hinbekommen mit SQLTools die Darstellung zu erreichen. Evtl. habt Ihr noch Verbesserungen oder Anregungen.
================================================================
Code:
--------------------------------------------------------------------------------
-- Script zum Abfragen von Oracle DB 9.2 i und umwandlung der Ausgaben in 
-- das XML 1.0 Format
-- Getestet mit dem Kommandozeilenprogramm SQLPLUSvon Oracle
--------------------------------------------------------------------------------
-- Schritt 1) Tabelle erstellen
-------------------------------
CREATE TABLE AUTO
(
  AUTO_ID   NUMBER NOT NULL ,
  AUTO_NAME VARCHAR2(200) NOT NULL
)
COMMIT;
---------------------------------
-- Schritt 2) Eingaben von tupels
---------------------------------
insert INTO  AUTO (AUTO_ID, AUTO_NAME)  VALUES (1, 'VW');
insert INTO  AUTO (AUTO_ID, AUTO_NAME)  VALUES (2, 'Ford');
insert INTO AUTO (AUTO_ID, AUTO_NAME)  VALUES (3, 'OPEL');
insert INTO AUTO (AUTO_ID, AUTO_NAME)  VALUES (4, 'Mercedes Benz');
COMMIT;
-----------------------------------
-- Schritt 3) Erstellen der temp
-- tabelle die das object aufnimmt
----------------------------------
CREATE TABLE temp_clob (
  erg  CLOB   NULL,
  zahl NUMBER NULL
)
COMMIT;
---------------------------------
SELECT * FROM auto;
--------------------------------
CREATE OR REPLACE PROCEDURE xml_to_clob_final
IS
--declare
      queryContext DBMS_XMLGEN.ctxHandle;
      --xmlResult XMLType;
			xmlResult CLOB ;
      zaehler number := 1;
begin
-- Context mit Select-Abfrage initialisieren
queryContext := DBMS_XMLGEN.newContext
(
'select auto_id, auto_name from auto'
);
-- Anzahl der Zeilen pro Zugriff setzen
DBMS_XMLGEN.setMaxRows(queryContext, 4);
-- Tagnamen setzen
DBMS_XMLGEN.setRowTag(queryContext,'Auto');
DBMS_XMLGEN.setRowSetTag(queryContext, 'Autoliste');
-- Schleife für die Zugriffe (2 Zeilen pro Schleifendurchlauf)
loop xmlResult := DBMS_XMLGEN.getXML(queryContext);
-- Schleifenende, wenn alle Zeilen der Select-Abfrage bearbeitet wurden
   exit when DBMS_XMLGEN.getNumRowsProcessed(queryContext) = 0;
   -- Ergebnis verarbeiten
   insert into temp_clob values (xmlResult, zaehler);
	 zaehler := zaehler + 1;
end loop;
-- Context schließen
DBMS_XMLGEN.closeContext(queryContext);
end;
/
--------------------------------------------------------------------------------
-- Aufruf der Procedur im SQLPLUS mit execute xml_to_clob_final;
--------------------------------------------------------------------------------
 
Die Prozedur legt die Anzahl der Zeilen aus dem Anfrageergebnis fest, die in XML umgewandelt werden (jeweils für einen Aufruf von getXML()). Benutzt man i.d.R. im Zusammenhang mit Paginating, also seitenweisem Erzeugen von XML. Da bei Dir nur 4 Zeilen in der Ergebnismenge der Anfrage drin sind, bekommst Du auch alles in XML umgewandelt.
 
Zurück