Dichiarazione CREATE NICKNAME - esempi per il wrapper dei servizi Web
Quando si crea un nickname per accedere a un servizio Web, si crea una colonna di input per ogni valore nel messaggio di input di un'operazione di servizio Web e una colonna di output per ogni valore nel messaggio di output di un'operazione di servizio Web. Le definizioni delle colonne di ingresso e di uscita si controllano con le definizioni delle opzioni della colonna nickname.
L'opzione TEMPLATE column specifica che una colonna è una colonna di input. L'opzione XPATH column specifica che una colonna è una colonna di output. Quando l'opzione TEMPLATE nickname contiene una notazione tra parentesi ([1,1]), la colonna è una colonna di input obbligatoria.
L'opzione nickname NAMESPACES è un elenco separato da virgole di coppie nome-valore che un sistema federato utilizza per risolvere i namespace degli elementi nei documenti XML di input e di output. Gli spazi dei nomi vengono utilizzati nella richiesta di messaggio in modo da definire i prefissi dell'opzione TEMPLATE nickname. L'opzione nickname NAMESPACES risolve i prefissi nelle espressioni XPath con gli URI degli spazi dei nomi definiti nel WSDL o negli schemi XML. Le espressioni XPath vengono applicate al documento XML restituito dal servizio Web.
Esempio 1: Colonne di input richieste
CREATE NICKNAME "stockquote.stockquoteport_getquote_nn" (
symbol VARCHAR (48) OPTIONS(TEMPLATE '&column'),
result VARCHAR (48) OPTIONS(XPATH './Result/text()'))
FOR SERVER "xmethods_server" OPTIONS(
URL 'http://66.28.98.121:9090/soap' ,
SOAPACTION 'urn:xmethods-delayed-quotes#getQuote' ,
TEMPLATE '<soapenv:Envelope>
<soapenv:Body>
<ns2:getQuote>
<symbol>&symbol[1,1]</symbol>
</ns2:getQuote>
</soapenv:Body>
</soapenv:Envelope>',
XPATH '/soapenv:Envelope/soapenv:Body/*' ,
NAMESPACES 'ns2="urn:xmethods-delayed-quotes" ,
ns1="http://www.example.com/wsdl/
net.xmethods.services.stockquote.StockQuote/" ,
soapenv="http://schemas.xmlsoap.org/soap/envelope/" ');L'opzione nickname TEMPLATE specifica la colonna SYMBOL come colonna di input obbligatoria, poiché la colonna contiene la designazione [1,1]. Nell'opzione nickname TEMPLATE, viene specificata la busta SOAP completa per il servizio Web. Il valore di input di getQuote è contenuto negli elementi envelope e body di SOAP. L'opzione XPATH nickname contiene le informazioni per trovare il valore del prezzo di negoziazione attraverso la busta SOAP e i tag body.SELECT * FROM "stockquote.stockquoteport_getquote_nn"
WHERE symbol='IBM';È necessario utilizzare il predicato symbol='IBM' in questa istruzione perché symbol è una colonna di input obbligatoria. Il predicato di uguaglianza è l'unico predicato valido sulle colonne di input. Ciascuno dei predicati di uguaglianza imposta un valore nel messaggio di input. Se la colonna di input è opzionale, non è necessario un predicato di uguaglianza su tale colonna. Se la colonna di input è obbligatoria, è necessario eseguire la query con un predicato di uguaglianza. È possibile utilizzare un valore letterale come IBM in un'espressione di uguaglianza o un valore da una tabella unita o un nickname.Esempio 2: Elementi ripetuti e nickname figlio
<wsdl:definitions name="Name"
targetNamespace="http://myzoo.com"
...
<wsdl:types>
<xsd:schema elementFormDefault="qualified" targetNamespace="http://myzoo.com"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="Animal">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="tns:Name"/>
<xsd:element ref="tns:Species"/>
<xsd:element ref="tns:Lot"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="AnimalCareList">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="unbounded" minOccurs="1" ref="tns:Animal"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Count" type="xsd:string"/>
<xsd:element name="LastModified" type="xsd:string"/>
<xsd:element name="Lot" type="xsd:string"/>
<xsd:element name="Name" type="xsd:string"/>
<xsd:element name="NumberOfCages" type="xsd:string"/>
<xsd:element name="Species" type="xsd:string"/>
<xsd:element name="Zoo">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="tns:ZooName"/>
<xsd:element ref="tns:Count"/>
<xsd:element ref="tns:LastModified"/>
<xsd:element maxOccurs="unbounded" minOccurs="0" ref="tns:Zookeeper"/>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:string" use="optional"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="ZooName" type="xsd:string"/>
<xsd:element name="Zookeeper">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="tns:Name"/>
<xsd:element ref="tns:NumberOfCages"/>
<xsd:element ref="tns:AnimalCareList"/>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:string" use="optional"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</wsdl:types>
...
CREATE NICKNAME zooport_getzooreport_nn (
zooid VARCHAR (48) OPTIONS(TEMPLATE '&column'),
zoo_id VARCHAR (48) OPTIONS(XPATH './ns1:Zoo/@ns1:id'),
report_zooname VARCHAR (48) OPTIONS(XPATH './ns1:Zoo/ns1:ZooName/text()'),
report_count VARCHAR (48) OPTIONS(XPATH './ns1:Zoo/ns1:Count/text()'),
report_lastmodified VARCHAR (48)
OPTIONS(XPATH './ns1:Zoo/ns1:LastModified/text()'),
zooport_getzooreport_pkey VARCHAR (16) FOR BIT DATA NOT NULL
OPTIONS(PRIMARY_KEY 'YES'))
FOR SERVER "zooserver" OPTIONS(
URL 'http://localhost:9080/MaelstromTest/services/ZooPort' ,
SOAPACTION 'http://myzoo.com/getZooReport' ,
TEMPLATE '<soapenv:Envelope>
<soapenv:Body>
<zooId>&zooId[1,1]</zooId>
</soapenv:Body>
</soapenv:Envelope>' ,
XPATH '/soapenv:Envelope/soapenv:Body' ,
NAMESPACES ' soapenv="http://schemas.xmlsoap.org/soap/envelope/" ,
ns1="http://myzoo.com " ');
CREATE NICKNAME zooport_getzooreport_report_nn (
zooport_getzooreport_fkey VARCHAR (16)
FOR BIT DATA NOT NULL
OPTIONS(FOREIGN_KEY 'ZOOPORT_GETZOOREPORT_NN'),
zookeeper_id VARCHAR (48) OPTIONS(XPATH './ns1:Zookeeper/@ns1:id'),
report_name VARCHAR (48) OPTIONS(XPATH './ns1:Zookeeper/ns1:Name/text()'),
report_numberofcages VARCHAR (48)
OPTIONS(XPATH './ns1:Zookeeper/ns1:NumberOfCages/text()'),
zooport_getzooreport_pkey VARCHAR (16)
FOR BIT DATA NOT NULL OPTIONS(PRIMARY_KEY 'YES'))
FOR SERVER "zooserver" OPTIONS(
XPATH './ns1:Zoo' ,
NAMESPACES ' soapenv="http://schemas.xmlsoap.org/soap/envelope/" ,
ns1="http://myzoo.com" ');
CREATE NICKNAME zooport_getzooreport_report_report_nn (
zooport_getzooreport_fkey VARCHAR (16) FOR BIT DATA NOT NULL
OPTIONS(FOREIGN_KEY 'zooport_getzooreport_report_nn'),
report_name VARCHAR (48)
OPTIONS(XPATH './ns1:Animal/ns1:Name/text()'),
report_species VARCHAR (48)
OPTIONS(XPATH './ns1:Animal/ns1:Species/text()'),
report_lot VARCHAR (48) OPTIONS(XPATH './ns1:Animal/ns1:Lot/text()'))
FOR SERVER "zooserver" OPTIONS(
XPATH './ns1:Zookeeper/ns1:AnimalCareList' ,
NAMESPACES ' soapenv="http://schemas.xmlsoap.org/soap/envelope/" ,
ns1="http://myzoo.com" ');
- Soprannome radice: zooport_getzooreport_nn
- Zoo (genitore):
- ZooName
- Conteggio
- LastModified
- ZooKeeper (ci sono 0 o più elementi ZooKeeper )
- Soprannome del bambino: zooport_getzooreport_report_nn
- Elementi di ZooKeeper
- Nome
- NumberOfCages
- AnimalCareList (ci sono 0 o più elementi Animal)
- Soprannome del bambino: zooport_getzooreport_report_nn
- Animale
- Nome
- Specie
- Lotto
SELECT * FROM zooport_getzooreport_nn ,
zooport_getzooreport_report_nn zk ,
zooport_getzooreport_report__report__nn a
WHERE zooid='1'AND zooport_getzooreport_pkey=zk.zooport_getzooreport_fkey
and zk.zooport_getzooreport_pkey=a.zooport_getzooreport_fkey;Esempio 3: Legame tardivo
L'esempio seguente mostra come utilizzare l'opzione di binding tardivo. Se si definiscono le opzioni URL e SOAPACTION del nickname e si abilitano le opzioni URLCOLUMN e SOAPACTIONCOLUMN della colonna quando si crea un nickname, si utilizzano le funzioni di binding tardive.
CREATE NICKNAME GetPartQuote(
partnumber INTEGER OPTIONS (TEMPLATE'&column'),
price FLOAT OPTIONS (XPATH './price')),
urlcol VARCHAR(100) OPTIONS (URLCOLUMN 'Y'),
soapactioncol VARCHAR(100) OPTIONS (SOAPACTIONCOLUMN 'Y'),
FOR SERVER myServer
OPTIONS (
...
SOAPACTION 'http://example.com/GetPartPrice' ,
URL 'http://mycompany.com:9080/GetPartPrice'',
...
)
SELECT * FROM supplier_endpoints p,
GetPartQuote q
WHERE partnumber=1234 AND
p.url=q.urlcol AND
p.soapaction=q.soapactioncol;
La tabella locale supplier_endpoints contiene tutti gli URL e gli indirizzi SOAP con cui è possibile chiamare il servizio Web. È possibile includere una clausola ORDER BY price per determinare il fornitore meno costoso per questo pezzo.Esempio 4: opzione di colonna ESCAPE_INPUT
È possibile includere frammenti XML come valori di input nella query. Quando si registra un nickname, includere l'opzione di colonna ESCAPE_INPUT=N. Questa opzione mantiene i caratteri speciali, come le parentesi angolari (< e >) nei frammenti XML nei valori di input.
Quando uno schema contiene valori di input ripetuti che richiedono l'invio di XML come parte del messaggio SOAP, è possibile usare l'opzione di colonna ESCAPE_INPUT per costruire il messaggio di output con l'XML corretto.
CREATE NICKNAME add_zookeeper(
zookeeper_id VARCHAR(48) OPTIONS(TEMPLATE '...'),
name VARCHAR(48) OPTIONS(TEMPLATE '...'),
numberofcages VARCHAR(48) OPTIONS(TEMPLATE '...'),
animals VARCHAR(3000) OPTIONS( TEMPLATE '...' , ESCAPE_INPUT 'N')
...Per aggiungere un nuovo guardiano dello zoo con due animali, si deve eseguire una query come quella dell'esempio seguente:SELECT * FROM add_zookeeper
WHERE zookeeper_ID='37' AND
name='Amit Kapoor' AND
numberofcages='3' AND
animals='<AnimalCareList xmlns="http://myzoo.com">
<Animal>
<Name>Larry</Name>
<Species>Gorilla</Species>
<Lot>7</Lot>
</Animal>
<Animal>
<Name>Bill</Name>
<Species>Chimpanzee</Species>
<Lot>8H</Lot>
</Animal>
</AnimalCareList>';Il nickname add_zookeeper è un'operazione del servizio Web che può modificare lo stato del servizio Web o aggiornare le informazioni. Anche se i wrapper non relazionali non possono essere aggiornati, l'istruzione SELECT di questo esempio aggiorna le informazioni sullo zoo per aggiungere un nuovo guardiano.
Si può anche usare l'opzione di colonna ESCAPE_INPUT per uno schema con un elemento come xsd:anyType. In questo caso, il tipo di elemento è sconosciuto. È possibile utilizzare l'opzione di colonna ESCAPE_INPUT sulla colonna di input per quell'elemento, in modo da poter specificare frammenti XML arbitrari per l'input.