La tecnica di ricerca dei dati XML è simile a quella per il richiamo: entrambe le tecniche richiamano i dati per effettuare ulteriori manipolazioni utilizzando la clausola WHERE che definisce i predicati come criteri di richiamo.
XML Extender fornisce vari metodi di ricerca documenti XML in una colonna XML, a seconda dell'applicazione utilizzata. Inoltre fornisce la funzione di ricerca struttura documenti e restituisce i risultati in base al contenuto degli elementi e dei valori attributo. E' possibile ricercare una vista della colonna XML e delle relative tabelle laterali, ricercare direttamente le tabelle laterali per migliorare le prestazioni oppure utilizzare le UDF di estrazione con le clausole WHERE. Inoltre è possibile utilizzare Text Extender e ricercare i dati di colonna all'interno del contenuto strutturale relativo a una stringa di testo.
Con XML Extender è possibile utilizzare gli indici nelle colonne delle tabelle laterali contenenti i valori attributo o il contenuto degli elementi XML estratti dai documenti XML, per una ricerca con velocità elevata. Specificando il tipo di dati di un elemento o attributo, è possibile ricercare il tipo di dati SQL generico oppure effettuare ricerca delimitate. Nell'esempio degli ordini di acquisto, è possibile ricercare tutti gli ordini con prezzo superiore a 2500.00.
Inoltre, è possibile utilizzare DB2 UDB Text Extender per effettuare ricerche di testo strutturale o ricerche di testo completo. Ad esempio, è possibile disporre di una colonna RESUME che contiene il riepilogo in formato XML. Si desidera conoscere il nome delle applicazioni con funzioni Java. E' possibile utilizzare DB2 Text Extender per ricercare nei documenti XML tutte le ricorrenze in cui l'elemento <skill> contiene la stringa di caratteri JAVA.
Le seguenti sezioni descrivono i metodi di ricerca:
Utilizzando le funzioni di ricerca XML Extender, è possibile ricercare dati XML in una colonna basata sulla struttura del documento, con elementi e attributi. Per ricercare i dati di colonna utilizzare un'istruzione SELECT in vari modi e restituire una serie di risultati sulla base delle corrispondenze agli elementi e attributi del documento. E' possibile ricercare i dati di colonna utilizzando i seguenti metodi:
Questi metodi sono descritti nelle sezioni riportate di seguito e utilizzano esempi con il seguente scenario. La tabella applicativa SALES_TAB presenta una colonna XML denominata ORDER. Questa colonna presenta tre tabelle laterali, ORDER_SIDE_TAB, PART_SIDE_TAB e SHIP_SIDE_TAB. La vista predefinita, sales_order_view, è stata specificata quando è stata abilitata la colonna ORDER e le tabelle vengono unite utilizzando la seguente istruzione CREATE VIEW:
CREATE VIEW sales_order_view(invoice_num, sales_person, order, order_key, customer, part_key, price, date) AS SELECT sales_tab.invoice_num, sales_tab.sales_person, sales_tab.order, order_side_tab.order_key, order_side_tab.customer, part_side_tab.part_key, ship_side_tab.date FROM sales_tab, order_side_tab, part_side_tab, ship_side_tab WHERE sales_tab.invoice_num = order_side_tab.invoice_num AND sales_tab.invoice_num = part_side_tab.invoice_num AND sales_tab.invoice_num = ship_side_tab.invoice_num
L'interrogazione diretta con la ricerca di interrogazioni secondarie fornisce la migliore prestazione della ricerca strutturale quando le tabelle laterali sono indicizzate. E' possibile utilizzare un'interrogazione o un'interrogazione secondaria per ricercare correttamente le tabelle laterali.
Esempio: la seguente istruzione utilizza un'interrogazione e un'interrogazione secondaria per ricercare direttamente una tabella laterale:
SELECT sales_person from sales_tab WHERE invoice_num in (SELECT invoice_num from part_side_tab WHERE price > 2500.00)
In questo esempio, invoice_num è la chiave primaria nella tabella SALES_TAB.
E' possibile che XML Extender effettui la creazione di una vista predefinita che unisce la tabella applicativa e le tabelle laterali utilizzando un ID univoco. E' possibile utilizzare questa vista predefinita oppure qualsiasi vista che unisce una tabella applicativa e le tabelle laterali, per ricercare dati di colonna e per effettuare interrogazioni nelle tabelle laterali. Questo metodo fornisce una vista virtuale singola della tabella applicativa e delle relative tabelle laterali. Tuttavia, tenere presente che la complessità di un'interrogazione è direttamente proporzionale al numero di tabelle laterali create.
Suggerimento: è possibile utilizzare root_id o DXXROOT_ID (creato da XML Extender), per unire le tabelle quando si crea la propria vista.
Esempio: la seguente istruzione ricerca la vista
SELECT sales_person from sales_order_view WHERE price > 2500.00
L'istruzione SQL restituisce i valori sales_person della tabella della vista di unione sales_order_view che presenta gli ordini di articoli con un prezzo superiore a 2500.00.
E' inoltre possibile utilizzare le UDF di estrazione di XML Extender per ricercare elementi o attributi, nel caso in cui non sono stati creati indici o tabelle laterali per la tabella applicativa. L'utilizzo delle UDF di estrazione per eseguire la scansione dei dati XML rende l'operazione molto complessa inoltre è necessario utilizzarle con le clausole WHERE che riducono il numero dei documenti XML inclusi nella ricerca.
Esempio: la seguente istruzione ricerca un'UDF di estrazione di XML Extender:
SELECT sales_person from sales_tab WHERE extractVarchar(order, '/Order/Customer/Name') like '%IBM%' AND invoice_num > 100
In questo esempio, la UDF di estrazione estrae gli elementi </Order/Customer/Name> con il valore IBM.
Per la ricerca di elementi o attributi con ricorrenza multipla, utilizzare la clausola DISTINCT per evitare valori duplicati.
Esempio: la seguente istruzione ricerca la clausola DISTINCT:
SELECT sales_person from sales_tab WHERE invoice_num in (SELECT DISTINCT invoice_num from part_side_tab WHERE price > 2500.00 )
In questo esempio, il file DAD specifica /Order/Part/Price con ricorrenza multipla e crea la tabella laterale PART_SIDE_TAB. La tabella PART_SIDE_TAB può presentare più di una riga con lo stesso invoice_num. Con DISTINCT vengono restituiti solo i valori univoci.
Quando si ricerca la struttura del documento XML, XML Extender ricerca i valori degli attributi e dell'elemento che sono stati convertiti nei tipi di dati generali, ma non ricerca il testo. E' possibile utilizzare DB2 UDB Text Extender per la ricerca di testo completo o strutturale in una colonna abilitata per XML. Text Extender supporta la ricerca del documento XML in DB2 UDB versione 6.1 o successiva.
Per utilizzare la ricerca Text Extender, è necessario installare DB2 Text Extender e abilitare il database e le tabelle come descritto di seguito. Per le modalità di utilizzo della ricerca Text Extender, consultare il capitolo relativo alla ricerca con le UDF di Text Extender della pubblicazione DB2 Universal Database Text Extender Administration and Programming.
Si supponga di disporre di un database abilitato per XML, effettuare le seguenti operazioni per abilitare Text Extender per la ricerca del contenuto di una colonna abilitata per XML. Ad esempio, il database è denominato SALES_DB, la tabella ORDER e i nomi della colonna XML sono XVARCHAR e XCLOB:
'connect to SALES_DB'
Nel prompt dei comandi db2tx, immettere:
'enable database'
'enable text column order xvarchar function db2xml.varchartovarchar handle varcharhandle ccsid 850 language us_english format xml indextype precise indexproperty sections_enabled documentmodel (Order) updateindex update'
'enable text column order xclob function db2xml.clob handle clobhandle ccsid 850 language us_english indextype precise updateindex update'
;list of document models [MODELS] modelname=Order ; an 'Order' document model definition ; left side = section name identifier ; right side = section name tag [Order] Order = /Order Order/Customer/Name = /Order/Customer/Name Order/Customer/Email = /Order/Customer/Email Order/Part/@color = /Order/Part/@color Order/Part/Shipment/ShipMode = /Order/Part/Shipment/ShipMode
La funzione di ricerca di Text Extender è strettamente correlata alla ricerca strutturale del documento XML Extender. Il metodo consigliato è la creazione di un'interrogazione che effettua ricerche negli elementi o negli attributi del documento e utilizza Text Extender per ricercare il contenuto dell'elemento o i valori dell'attributo.
Esempio: le seguenti istruzioni ricercano un testo del documento XML con Text Extender. Dalla finestra Comandi DB2, immettere:
'connect to SALES_DB' 'select xvarchar from order where db2tx.contains(varcharhandle, 'model Order section(Order/Customer/Name) "Motors"')=1' 'select xclob from order where db2tx.contains(clobhandle, 'model Order section(Order/Customer/Name) "Motors"')=1'
Le ricerche UDF Contains() di Text Extender.
Questo esempio non riporta tutte le operazioni necessarie per utilizzare Text Extender nella ricerca di dati di colonna. Per ulteriori informazioni sui concetti e le funzioni della ricerca Text Extender , consultare il capitolo relativo alla ricerca con le UDF di Text Extender della pubblicazione DB2 Universal Database Text Extender Administration and Programming.