Serializzazione XML
La serializzazione XML è il processo di conversione dei dati XML dalla loro rappresentazione interna in una tabella di tipo Db2 e al formato testuale XML che hanno in un'applicazione.
È possibile invocare la funzione XMLSERIALIZE per richiedere al server di database Db2 di eseguire la serializzazione XML prima di inviare i dati XML all'applicazione client. Questo processo è chiamato serializzazione esplicita. In alternativa, è possibile omettere la chiamata XMLSERIALIZE e recuperare i dati da una colonna XML direttamente nelle variabili dell'applicazione. Il server di database Db2 serializza i dati XML durante il recupero. Questo processo è chiamato serializzazione implicita.
Con la serializzazione implicita, i dati hanno il tipo XML quando vengono inviati al client, se il client supporta il tipo di dati XML. Per le applicazioni Db2 , ODBC e embedded SQL, il server di database Db2 aggiunge ai dati una dichiarazione XML, con la specifica di codifica appropriata. Per le applicazioni Java™, il server di database Db2 non aggiunge una dichiarazione XML, a meno che non si utilizzino i metodi obsoleti DB2Xml.getDB2Xmlxxx per recuperare i dati.
La serializzazione implicita è il metodo preferito nella maggior parte dei casi. L'invio di dati XML al client consente al client dell' Db2 e di gestire correttamente i dati XML. La serializzazione esplicita richiede un'ulteriore gestione da parte del cliente.
È possibile recuperare i dati XML nel formato binario XML (Extensible Dynamic Binary XML Db2 Client/Server Binary XML Format), anziché come dati XML testuali, per evitare la serializzazione. Il recupero dei dati in formato binario XML è supportato solo nelle applicazioni JDBC, SQLJ o ODBC, oppure dall'utility UNLOAD.
Dopo un invocazione esplicita di XMLSERIALIZE, i dati hanno un tipo di dati non XML nel server del database e vengono inviati al client come tale tipo di dati.
- Il tipo di dati SQL a cui i dati vengono convertiti quando vengono serializzati
Il tipo di dati è un tipo di dati CLOB, BLOB, DBCLOB.
- Se i dati di output devono includere la seguente dichiarazione XML esplicita (ESCLUDENDO XMLDECLARATION o INCLUDENDO XMLDECLARATION):
<?xml version="1.0" encoding="UTF-8"?>
Assicurati di aver compreso le implicazioni della richiesta di una specifica di codifica esplicita quando esegui XMLSERIALIZE. Se si recuperano i dati testuali XML in un tipo di dati non binario, i dati vengono convertiti nella codifica dell'applicazione, ma la specifica di codifica non viene modificata. Pertanto, la codifica dei dati potrebbe non essere conforme alle specifiche di codifica. Questa situazione si traduce in dati XML che non possono essere analizzati dai processi applicativi che si basano sul nome della codifica.
- Quando i documenti XML sono molto grandi
Poiché non esistono localizzatori XML, se i documenti XML sono molto grandi, è possibile utilizzare XMLSERIALIZE per convertire i dati in un tipo LOB in modo da poter utilizzare i localizzatori LOB.
- Quando il cliente non supporta i dati XML
Se il client è una versione precedente che non supporta il tipo di dati XML e si utilizza la serializzazione XML implicita, il server di database Db2 converte i dati nel tipo di dati BLOB. Se si desidera che i dati recuperati siano di un altro tipo, è possibile eseguire dinamicamente un'istruzione SQL che richiama XMLSERIALIZE per specificare l'output CLOB o DBCLOB.
- Quando si desidera passare dati XML a una stored procedure o a una funzione definita dall'utente
Db2 for z/OS® le procedure memorizzate e le funzioni definite dall'utente non supportano i parametri con il tipo di dati XML. Pertanto, se si desidera passare i dati da una colonna XML a una routine, è necessario richiamare XMLSERIALIZE sui dati per convertirli in un tipo BLOB, CLOB o DBCLOB.
Il miglior tipo di dati per convertire i dati XML è il tipo di dati BLOB, perché il recupero dei dati binari comporta meno problemi di codifica.
<customerinfo xml:space="default" xmlns="http://posample.org" Cid='1000'>
<name>Kathy Smith</name>
<addr country='Canada'>
<street>5 Rosewood</street>
<city>Toronto</city>
<prov-state>Ontario</prov-state>
<pcode-zip>M6W 1E6</pcode-zip>
</addr>
<phone type='work'>416-555-1358</phone>
</customerinfo>Richiama XMLSERIALIZE per serializzare i dati e convertirli in un tipo BLOB prima di recuperarli in una variabile host.SELECT XMLSERIALIZE(Info as BLOB(1M)) from Customer
WHERE CID='1000'EXEC SQL BEGIN DECLARE SECTION;
SQL TYPE IS XML AS BLOB (1M) xmlCustInfo;
EXEC SQL END DECLARE SECTION;
…
EXEC SQL SELECT INFO INTO :xmlCustInfo
FROM Customer
WHERE Cid=1000;import java.sql.*; // JDBC base
import com.ibm.db2.jcc.*; // IBM Data Server Driver for JDBC
// and SQLJ implementation of JDBC
…
com.ibm.db2.jcc.DB2SimpleDataSource db2ds =
new com.ibm.db2.jcc.DB2SimpleDataSource();
// Create the DataSource object
db2ds.setDriverType(4); // Set the driver type
db2ds.setDatabaseName("san_jose"); // Set the location
db2ds.setUser("db2adm"); // Set the user
db2ds.setPassword("db2adm"); // Set the password
db2ds.setServerName("mvs1.sj.ibm.com");
// Set the server name
db2ds.setPortNumber(5021); // Set the port number
db2ds.setXMLFormat(
com.ibm.db2.jcc.DB2BaseDataSource.XML_FORMAT_BINARY);
// Set XML format to binary
…
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT INFO FROM Customer WHERE Cid='1000'");
SQLXML sqlxml = rs.getSQLXML(1);
DOMSource domSource = sqlxml.getSource(DOMSource.class);
// Get a DOMSource object from
// the SQLXML object, to avoid
// XML serialization
Document document = (Document) domSource.getNode();