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.
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.
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.
XML Extender fornisce due procedure memorizzate, dxxShredXML() e dxxInsertXML,per la scomposizione di documenti XML.
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);
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);