Manuali IBM

XML Extender - Gestione e programmazione


Scomposizione dei documenti XML in dati DB2

Scomporre un documento XML significa disgregare i dati all'interno di un documento XML e memorizzarli nelle tabelle relazionali. XML Extender fornisce le procedure memorizzate per scomporre i dati XML dei documenti XML di origine nelle tabelle relazionali. Per utilizzare queste procedure memorizzate, è necessario creare un file DAD che specifica l'associazione tra il documento XML e la struttura della tabella DB2. Le procedure memorizzate utilizzano il file DAD per scomporre il documento XML. Per informazioni sulla creazione di un file DAD, consultare la sezione Pianificazione per le raccolte XML.

Abilitazione di una raccolta XML per la scomposizione

Nella maggior parte dei casi, è necessario abilitare una raccolta XML prima di utilizzare le procedure memorizzate. Nei seguenti casi, è obbligatorio abilitare una raccolta XML:

Se si desidera che il file DAD venga trasferito automaticamente quando nel database esistono già delle tabelle, non è necessario abilitare la raccolta XML.

Limiti della scomposizione delle dimensioni della tabella

La scomposizione utilizza l'associazione RDB_node per specificare come un documento XML si scompone in tabelle DB2, estraendo i valori attributo ed elemento nelle righe della tabella. I valori di ciascun documento XML vengono memorizzati in uno o più tabelle DB2. Una tabella può presentare massimo 1024 righe scomposte da ciascun documento.

Ad esempio, se un documento XML si scompone in cinque tabelle, ogni tabella può presentare massimo 1024 righe per quel determinato documento. Se la tabella presenta righe per più documenti, è possibile che contenga massimo 1024 righe per ciascun documento. Se la tabella presenta 20 documenti, è possibile che contenga 20.480 righe, 1024 per ciascun documento.

L'utilizzo di elementi con ricorrenza multipla (elementi con percorsi di ubicazione multipla nella struttura XML) incide sul numero di righe. Ad esempio, un documento che contiene un elemento <Part> che ricorre 20 volte, è necessario che sia scomposto in 20 righe in una tabella. Quando si utilizzano elementi con ricorrenza multipla, considerare questa restrizione delle dimensioni di tabella.

Informazioni preliminari

Scomposizione del documento XML

XML Extender fornisce due procedure memorizzate, dxxShredXML() e dxxInsertXML,per la scomposizione di documenti XML.

dxxShredXML()
Questa procedura memorizzata viene utilizzata per le applicazioni che eseguono aggiornamenti occasionali o per le applicazioni che non sono in grado di eseguire la completa gestione dei dati XML. La procedura memorizzata dxxShredXML() non richiede una raccolta abilitata ma utilizza un file DAD.

La procedura memorizzata dxxShredXML() rileva due parametri di input, un file DAD e il documento XML da scomporre e restituisce due parametri di output: un codice di ritorno e un messaggio di errore.

La procedura memorizzata dxxShredXML() inserisce un documento XML in una raccolta XML a seconda della specifica <Xcollection> nel file DAD di input. Si presume che le tabelle utilizzate in <Xcollection> del file DAD esistano e che le colonne soddisfano i tipi di dati specificati nell'associazione DAD. In caso contrario, viene restituito un messaggio di errore. La procedura memorizzata dxxShredXML() quindi scompone il documento XML e inserisce i dati XML privi di tag nelle tabelle specificate nel file DAD.

La procedura memorizzata corrispondente per la composizione è dxxGenXML() la quale rileva anche il file DAD come parametro di input e non richiede che la raccolta XML sia abilitata.

Per scomporre una raccolta XML: dxxShredXML()

Comprende il richiamo di una procedura memorizzata utilizzando la seguente procedura:

dxxShredXML(CLOB(100K)    DAD,            /* input */
             CLOB(1M)       xmlobj,           /* input */
               long           returnCode,      /* output */
               varchar(1024)  returnMsg)       /* output */

Per la sintassi completa e gli esempi consultare la sezione dxxShredXML().

Esempio: di seguito è riportato un esempio di un richiamo di dxxShredXML():

#include "dxx.h" #include "dxxrc.h"
 
            EXEC SQL INCLUDE SQLCA;
EXEC SQL BEGIN DECLARE SECTION;
              SQL TYPE is CLOB dad;           /* DAD*/
              SQL TYPE is CLOB_FILE  dadFile; /* DAD file*/
              SQL TYPE is CLOB xmlDoc;        /* input XML document */
              SQL TYPE is CLOB_FILE xmlFile;  /* input XMLfile */
              long                  returnCode;      /* error code */
              char    returnMsg[1024];  /* error message text */
     short                  dad_ind;
              short                 xmlDoc_ind;
              short   returnCode_ind;
              short   returnMsg_ind;
EXEC SQL END DECLARE SECTION;
 
              /* initialize host variable and indicators */
        strcpy(dadFile.name,"c:\dxx\samples\dad\getstart_xcollection.dad");
        dadFile.name_length=strlen("c:\dxx\samples\dad\getstart_xcollection.dad");
              dadFile.file_option=SQL_FILE_READ;
        strcpy(xmlFile.name,"c:\dxx\samples\cmd\getstart_xcollection.xml");
        xmlFile.name_length=strlen("c:\dxx\samples\cmd\getstart_xcollection.xml");
              xmlFile.file_option=SQL_FILE_READ;
              SQL EXEC VALUES (:dadFile) INTO :dad;
              SQL EXEC VALUES (:xmlFile) INTO :xmlDoc;
              returnCode = 0;
              returnMsg[0] = '\0';
     dad_ind = 0;
              xmlDoc_ind = 0;
              returnCode_ind = -1;
              returnMsg_ind = -1;
 
              /* Call the store procedure */
              EXEC SQL CALL db2xml!dxxShredXML(:dad:dad_ind;
                              :xmlDoc:xmlDoc_ind,
                     :returnCode:returnCode_ind,:returnMsg:returnMsg_ind); 

dxxInsertXML()
Questa procedura memorizzata viene utilizzata per le applicazioni che eseguono aggiornamenti regolari. Poiché vengono eseguite sempre le stesse attività, è importante che le prestazioni siano ottimali. L'abilitazione di una raccolta XML e l'utilizzo del nome di raccolta nella procedura memorizzata migliora le prestazioni. La procedura memorizzata dxxInsertXML() corrisponde alla procedura memorizzata dxxShredXML(), l'unica differenza è che la prima rileva una raccolta XML abilitata come primo parametro di input.

La procedura memorizzata dxxInsertXML() inserisce un documento XML in una raccolta XML abilitata, associata a un file DAD. Il file DAD contiene le specifiche relative alle tabelle della raccolta e all'associazione. Le tabelle della raccolta vengono selezionate o create in base alle specifiche contenute in <Xcollection>. La procedura memorizzata dxxInsertXML() quindi scompone il documento XML in base all'associazione e inserisce i dati XML privi di tag nelle tabelle della raccolta XML.

La procedura memorizzata corrispondente per la composizione è dxxRetrieveXML() la quale rileva il nome di una raccolta XML abilitata.

Per scomporre una raccolta XML: dxxInsertXML()

Comprende il richiamo di una procedura memorizzata utilizzando la seguente procedura:

dxxInsertXML(char(UDB_SIZE) collectionName,   /* input */
             CLOB(1M)       xmlobj,           /* input */
               long           returnCode,      /* output */
               varchar(1024)  returnMsg)       /* output */

Per la sintassi completa e gli esempi consultare la sezione dxxInsertXML().

Esempio: di seguito è riportato un esempio di richiamo di dxxInsertXML():

#include "dxx.h" #include "dxxrc.h"
 
            EXEC SQL INCLUDE SQLCA;
EXEC SQL BEGIN DECLARE SECTION;
              char                  collection[64];  /* name of an XML collection */
              SQL TYPE is CLOB_FILE xmlFile;  /* input XMLfile */
         SQL TYPE is CLOB      xmlDoc;           /* input XML doc */
              long                  returnCode;      /* error code */
              char    returnMsg[1024];  /* error message text */
              short                 collection_ind;
              short                 xmlDoc_ind;
              short   returnCode_ind;
              short   returnMsg_ind;
EXEC SQL END DECLARE SECTION;
         
              /* initialize host variable and indicators */
              strcpy(collection,"sales_ord")
         strcpy(xmlobj.name,"c:\dxx\samples\cmd\getstart_xcollection.xml");
         xmlobj.name_length=strlen("c:\dxx\samples\cmd\getstart_xcollection.xml");
              xmlobj.file_option=SQL_FILE_READ;
         SQL EXEC VALUES (:xmlFile) INTO (:xmlDoc);
              returnCode = 0;
              returnMsg[0] = '\0';
              collection_ind = 0;
              xmlobj_ind = 0;
              returnCode_ind = -1;
              returnMsg_ind = -1;
 
              /* Call the store procedure */
              EXEC SQL CALL db2xml!dxxInsertXML(:collection:collection_ind;
                              :xmlDoc:xmlDoc_ind,
                     :returnCode:returnCode_ind,:returnMsg:returnMsg_ind); 


[ Inizio pagina | Pagina precedente | Pagina successiva | Indice | Indice analitico ]