+ All Categories
Home > Documents > XQuery in DB2, Oracle ed SQL Server - cs.unibo.itmontesi/CBD/05QueryNeiDBMS.pdf ·...

XQuery in DB2, Oracle ed SQL Server - cs.unibo.itmontesi/CBD/05QueryNeiDBMS.pdf ·...

Date post: 14-Feb-2019
Category:
Upload: vandieu
View: 221 times
Download: 0 times
Share this document with a friend
48
XQuery in DB2, Oracle ed SQL Server
Transcript

XQuery in DB2, Oracle ed SQL Server

XQuery  in  DB2,  Oracle  e  SQL  Server  

Introduzione  l  Analizziamo  il  supporto  allo  standard  XQuery  fornito  dai  DBMS  più  diffusi,  evidenziando  eventuali  differenze  tra  lo  standard  e  le  sue  implementazioni.  

 l  Esamineremo  i  DBMS:  -­‐  DB2  Express-­‐C  (Versione  10.1)  -­‐  Oracle  XML  DB  (Versione  11.2)  -­‐  MS  SQL  Server  2012    l  Mostreremo  alcune  query  effeNuate  sui  tre  sistemi,  soNolineando  le  eventuali  differenze.  Inoltre,  meNeremo  l'accento  sulle  feature  esclusive  dei  tre  sistemi,  e  sulle  tecniche  che  quesQ  meNono  a  disposizione  degli  utenQ  per  integrare  archivi  XML  con  database  relazionali.  

 l   Infine  faremo  qualche  riferimento  ad  Oracle  Berkeley  XML,  un  insieme  di  librerie  dedicate  alla  gesQone  di  database  XML.  

XQuery  in  DB2,  Oracle  e  SQL  Server  

DocumenQ  di  esempio  

Mostreremo  alcune  interrogazioni  XQuery  eseguite  sui  diversi  DBMS.  I  documenQ  che  andremo  ad  interrogare  sono  Employees.xml  e  Departments.xml,  che    rappresentano  gli  impiegaQ  di  un'azienda  ed  i  diparQmenQ  in  cui  lavorano.  I  due    documenQ  sono  'collegaQ'  dall'aNributo  deptno,  che  verrà  uQlizzato  per    effeNuare  eventuali  join.  

XQuery  in  DB2,  Oracle  e  SQL  Server  

Documento  di  esempio:  Departments  

Departments.xml <depts> <dept deptno="10" dname="Administration"/> <dept deptno="20" dname="Marketing"/> <dept deptno="30" dname="Purchasing"/> <dept deptno="40" dname="Publishing"/> <dept deptno="50" dname="Transport"/> </depts>

XQuery  in  DB2,  Oracle  e  SQL  Server  

Documento  di  esempio:  Employees  

Employees.xml <emps>

<emp empno="1" deptno="10" ename="John" salary="21000"/> <emp empno="2" deptno="10" ename="Jack" salary="310000"/> <emp empno="3" deptno="20" ename="Jill" salary="100001"/> <emp empno="4" deptno="30" ename="Andrew" salary="50000"/> <emp empno="5" deptno="30" ename="Smith" salary="123000"/> <emp empno="6" deptno="30" ename="James" salary="34000"/> <emp empno="7" deptno="40" ename="Tom" salary="210000"/> <emp empno="8" deptno="40" ename="Derek" salary="223000"/> <emp empno="9" deptno="50" ename="Alice" salary="120000"/> <emp empno="10" deptno="50" ename="Sandra" salary="12000"/>

</emps>

XQuery  in  DB2,  Oracle  e  SQL  Server  

XQuery su DB2

DB2,  XML  e  XQuery  l   DB2  permeNe  di  inserire  in  tabelle  relazionali  colonne  di  Qpo  XML,  in  cui  è  poi  possibile  inserire  dei  daQ  uQlizzando  dei  normali  comandi  INSERT  combinaQ  con  la  funzione  XMLPARSE,  che  prende  in  input  una  stringa  e  (se  possibile)  la  converte  in  un  frammento  XML  che  il  DBMS  riesce  a  gesQre.    l   Perchè  sia  possibile  uQlizzare  il  Qpo  XML,  il  database  deve  usare  la  codifica  UTF-­‐8  (questa  opzione  si  può  scegliere  alla  sua  creazione).    l   Le  interrogazioni  XQuery  andranno  poi  inserite  all'interno  della  clausola  SELECT  di  interrogazioni  SQL,  uQlizzando  la  funzione  XMLQUERY,  e  resQtuiranno  dei  frammenQ  XML.    l   E'  possibile  anche  uQlizzare  altre  funzioni  per  combinare  query  relazionali  e  interrogazioni  XQuery:  XMLEXISTS  può  essere  uQlizzata  all'interno  della  clausola  WHERE,  mentre  XMLTABLE  viene  uQlizzata  all'interno  della  clausola  FROM.  

XQuery  in  DB2,  Oracle  e  SQL  Server  

DB2:  Path  expression  DB2  fornisce  un  supporto  completo  per  tua  gli  assi  delle  path  expression,  tua  i  Qpi  di  nodo  e  tua  i  test  previsQ  dallo  standard  XPath.  

Esempi:    l   /descendant-or-self::book[attribute::year>1992]  (seleziona  tua  gli  elemenQ  'book'  appartenenQ  all'asse  'descendant-­‐or-­‐self'  che  abbiano  un  aNributo  'year'  con  valore  maggiore  di  1992)    l  /child::bib/child::book/child::text()  (seleziona  tua  gli  elemenQ  di  Qpo  testuale  figli  di  un  elemento  'book'  a  sua  volta  figlio  di  un  elemento  'bib')  

XQuery  in  DB2,  Oracle  e  SQL  Server  

DB2:  Creazione  di  una  tabella  XML  

Per  iniziare  la  nostra  serie  di  esempi,  dobbiamo  creare  delle  tabelle  in  grado  di  contenere  daQ  di  Qpo  XML:  per  fare  questo,  è  sufficiente  specificare  XML  come  Qpo  di  dato  di  una  colonna.  Nel  nostro  caso,  vogliamo  due  tabelle,  ciascuna  delle  quali  conterrà  uno  dei  documenQ  visQ  in  precedenza.  

Esempi database CREATE TABLE employees (data XML) CREATE TABLE departments (data XML)

XQuery  in  DB2,  Oracle  e  SQL  Server  

DB2:  Inserimento  di  daQ  XML  in  una  tabella  

Per  inserire  i  daQ  nelle  tabelle  che  abbiamo  costruito,  basterà  usare  la  funzione    XMLPARSE  all'interno  di  una  normale  clausola  INSERT,  passandole  una  stringa    rappresentante  il  documento  XML  che  vogliamo  inserire  nella  tabella.  E'  possibile    scegliere  se  mantenere  o  meno  il  whitespace.  

Esempio insert INSERT INTO departments(data) VALUES (XMLPARSE (document cast ('<depts> <dept deptno="10" dname="Administration"/> .... <dept deptno="50" dname="Transport"/> </depts>' as clob) preserve whitespace) )

XQuery  in  DB2,  Oracle  e  SQL  Server  

DB2:  XQuery  in  SELECT  Ora  che  abbiamo  inserito  i  daQ  nelle  tabelle,  cominciamo  a  fare  qualche  query.  In  questo  primo  esempio,  vogliamo  estrarre  i  nomi  di  tua  i  diparQmenQ  ed  inserirli  in  elemenQ  XML  <deptName>.  UQlizziamo  la  funzione  XMLQUERY  per  inserire  l'interrogazione  XQuery  in  un'espressione  SQL.  

XQuery 1 SELECT XMLQUERY

('for $d in $list//dept return <deptName>{ $d/@dname }</deptName>' passing dtable.data as "list")

FROM departments dtable

La  clausola  passing  serve  per  specificare  su  quale  frammento  XML  si  sta  lavorando.  In  questo  caso  passiamo  il  contenuto  della  tabella  departments  come  ‟list”:  in  questo  modo  verrà  creata  una  variabile  $list  che  potremo  uQlizzare  all'interno  della  query  per  riferirci  al  frammento  XML  che  abbiamo  inserito  in  precedenza  nella  tabella.  

XQuery  in  DB2,  Oracle  e  SQL  Server  

DB2:  XQuery  con  where  ed  order  by  in  SELECT    Complichiamo  un  po'  la  query:  adesso  vogliamo  estrarre  i  nomi  e  gli  sQpendi  di    tua  gli  impiegaQ  con  sQpendio  superiore  a  50.000.  Inoltre,  vogliamo  che  i  risultaQ    siano  inseriQ  in  elemenQ  <empSalary>  ed  ordinaQ  per  sQpendio.  

XQuery 2 SELECT XMLQUERY

('for $e in $list//emp where $e/@salary > 50000 order by $e/@salary return <empSalary>{ $e/@ename }{$e/@salary}</empSalary>' passing etable.data as "list")

FROM employees etable

XQuery  in  DB2,  Oracle  e  SQL  Server  

DB2:  :  XQuery  con  let  ed  operatori  aggregaQ  in  SELECT  

Vogliamo  estrarre  per  ogni  impiegato  il  suo  nome,  il  suo  sQpendio  e  la  media  degli  sQpendi  del  diparQmento  in  cui  lavora.  

XQuery 3 SELECT XMLQUERY

('for $e in $list//emp let $avgsal := avg($list//emp[@deptno = $e/@deptno]/@salary) return <averages>{$e/@ename}{$e/@salary}{$avgsal}</averages>' passing etable.data as "list")

FROM employees etable

La  clausola  let  verrà  eseguita  ad  ogni  ciclo  del  for,  calcolando  per  ogni  elemento  <emp>  la  media  dei  valori  @salary  di  tua  gli  elemenQ  <emp>  con  il  suo  stesso  @deptno.  

XQuery  in  DB2,  Oracle  e  SQL  Server  

DB2:  Operatori  condizionali  

In  questo  esempio  vogliamo  creare  un  elemento  <salaries>  che  sia  vuoto  se    l'impiegato  John  guadagna  più  dell'impiegato  Smith,  e  che  contenga  lo  sQpendio    di  Smith  altrimenQ.  

XQuery 4 SELECT XMLQUERY

('let $john := $list//emp[@ename="John"] let $smith := $list//emp[@ename="Smith"] return if ($john/@salary > $smith/@salary) then <salaries/> else <salaries>{$smith/@salary}</salaries>' passing etable.data as "list")

FROM employees etable

XQuery  in  DB2,  Oracle  e  SQL  Server  

DB2:  Operatori  su  insiemi  

In  questo  esempio  vogliamo  estrarre  i  nomi  di  tua  gli  impiegaQ  che  lavorano  nel    diparQmento  con  @deptno  30,  e  di  quelli  che  guadagnino  meno  di  100.000.  

XQuery 5 SELECT XMLQUERY

('let $emps30 := $list//emp[@deptno = 30] let $empspoor := $list//emp[@salary < 100000] for $e in ($emps30 union $empspoor) return <empName>{$e/@ename}</empName>' passing etable.data as "list")

FROM employees etable

In  questo  caso,  la  clausola  let  è  al  di  fuori  della  clausola  for  e  quindi  viene  calcolata  soltanto  una  volta.  

XQuery  in  DB2,  Oracle  e  SQL  Server  

DB2:  QuanQficatori  

In  questo  esempio  vogliamo  estrarre  i  nomi  e  gli  sQpendi  di  tua  gli  impiegaQ,  ma    solo  se  c'è  almeno  un  impiegato  che  abbia  uno  sQpendio  superiore  a  100000.  

XQuery 6 SELECT XMLQUERY

('if (some $emp in $list//emp satisfies ($emp/@salary > 100000))

then <results>

{for $e in $list//emp return <emp>{$e/@ename}{$e/@salary}</emp>}

</results> else

<results/>' passing etable.data as "list")

FROM employees etable

XQuery  in  DB2,  Oracle  e  SQL  Server  

DB2:  Join  

In  questo  esempio,  vogliamo  selezionare  il  nome  di  tua  gli  impiegaQ  che    lavorano  nel  diparQmento  chiamato  ‟Purchasing”.  

XQuery 7 SELECT XMLQUERY

('let $purchasingdep := $dlist//dept[@dname = "Purchasing"] for $e in $elist//emp where $e/@deptno = $purchasingdep/@deptno return <empName>{$e/@ename}</empName>' passing etable.data as "elist", dtable.data as "dlist")

FROM employees etable, departments dtable

Perchè  il  join  tra  le  due  tabelle  funzioni,  dobbiamo  uQlizzare  la  clausola  passing  per  passare  sia  il  contenuto  di  employees  che  quello  di  departments.  

XQuery  in  DB2,  Oracle  e  SQL  Server  

DB2:  Join,  clausola  let  ed  operatori  aggregaQ  

Ora  vogliamo  selezionare,  per  ogni  diparQmento,  il  suo  nome  e  la  somma  degli  sQpendi  degli  impiegaQ  che  ci  lavorano.  

XQuery 8

SELECT XMLQUERY

('for $d in $dlist//dept let $sumsalary := sum($elist//emp[@deptno = $d/@deptno]/@salary) return <deptCost>{$d/@dname} {$sumsalary}</deptCost>' passing etable.data as "elist", dtable.data as "dlist")

FROM employees etable, departments dtable

XQuery  in  DB2,  Oracle  e  SQL  Server  

DB2:  UlQmo  esempio  di  XQuery  in  SELECT  Vogliamo  selezionare  per  ogni  diparQmento  il  numero  dei  suoi  impiegaQ  ed  il  loro    sQpendio  medio.  Vogliamo  che  i  risultaQ  siano  ordinaQ  in  base  al  costo  totale  (la    somma  degli  sQpendi)  di  ogni  diparQmento,  e  che  solo  i  diparQmenQ  con  più  di  un    impiegato  siano  inclusi  in  questa  query.  

XQuery  in  DB2,  Oracle  e  SQL  Server  

XQuery 9 SELECT XMLQUERY

('for $d in $dlist//dept let $emps := $elist//emp[@deptno = $d/@deptno] where count($emps) > 1 order by sum($emps/@salary) descending return <big-dept> {$d/@dname} <headcount> {count($emps)}</headcount> <avgsal>{avg($emps/@salary)}</avgsal> </big-dept>'

passing etable.data as "elist", dtable.data as "dlist") FROM employees etable, departments dtable

XQuery in Oracle DB

Oracle  DB  e  XQuery  

l  Oracle  DB  fornisce  un  supporto  completo  ad  XQuery,  in  maniera  molto  simile  a  DB2:  come  si  vedrà  negli  esempi,  gran  parte  delle  funzioni  uQlizzate  sono  le  stesse.  

 l  Oracle  XML  DB  è  progeNato  con  parQcolare  aNenzione  alla  coesistenza  tra  XML  ed  SQL.  

XQuery  in  DB2,  Oracle  e  SQL  Server  

Oracle  DB:  Funzionalita‘  non  supportate  

Anche  se  OracleDB  implementa  tuNe  le  caraNerisQche  principali  di    XQuery,  alcune  funzionalita‘  presenQ  nello  standard  non  sono    supportate:    l   version  encoding:  non  è  possibile  specificare  la  codifica  uQlizzata  all'interno  dell'espressione  XQuery;  

l   xml:id:  se  si  uQlizza  questa  funzionalita‘,  viene  generato  un  errore;  l   xs:duraOon:  questo  Qpo  di  dato  non  è  supportato;  è  possibile  usare  i  Qpi  xs:yearMonthDuraQon  o  xs:DayTimeDuraQon  in  alternaQva.  

l   schema  validaOon  feature  (opzionale  nello  standard);  l   module  feature  (opzionale  nello  standard).  

XQuery  in  DB2,  Oracle  e  SQL  Server  

Oracle  DB  e  XPath  2.0  

OracleDB  fornisce  pieno  supporto  alle  funzioni  e  agli  operatori  inclusi  in    XPath  2.0  (come  le  operazioni  tra  insiemi  e  i  quanQficatori  già  visQ  per    DB2),  con  alcune  eccezioni:    l   non  è  possibile  uQlizzare  le  funzioni  standard  per  la  definizione  di  espressioni  regolari,  ma  bisogna  usare  quelle  built-­‐in  all'interno  del  DBMS;  

l   non  sono  supportate  le  funzioni  fn:id  e  fn:idref;  l   non  è  supportata  la  funzione  fn:collecOon  senza  argomenQ.    

XQuery  in  DB2,  Oracle  e  SQL  Server  

Oracle  DB:  Creazione  di  una  tabella  XML  

Come  in  DB2,  in  Oracle  DB  è  possibile  inserire  all'interno  di  tabelle  relazionali  delle  colonne  di  Qpo  XML,  uQlizzando  la  parola  chiave  XMLType.  E'  inoltre  possibile  creare  delle  tabelle  che  siano  esse  stesse  di  Qpo  XML.  

Esempi: Creazione di una tabella XML: CREATE TABLE employees OF XMLType Creazione di una tabella relazionale con una colonna XML: CREATE TABLE departments

(id NUMBER(4), data XMLType)

Negli  esempi  seguenQ,  assumeremo  che  sia  employees  che  departments  siano  tabelle  di  Qpo  XML.  

XQuery  in  DB2,  Oracle  e  SQL  Server  

Oracle  DB:  Implementazioni  dell'XMLType  

L‘XMLType  è  un  costruNo  astraNo,  e  può  essere  implementato  dal  DBMS  in  due  modi:    l   All'interno  di  un  LOB  (Large  OBject),  ovvero  come  una  semplice  stringa.  l   In  uno  Structured  Storage:  scegliendo  questa  ozpione,  il  DBMS  si  costruirà  automaQcamente  tabelle  e  viste  che  seguano  lo  schema  XML  del  documento  e  le  userà  per  contenere  i  singoli  nodi  che  esso  conQene,  rimanendo  fedele  al  suo  DOM  (Document  Object  Model).    La  scelta  dell'implementazione  non  ha  nessuna  conseguenza  sui  metodi  che  l'utente  dovrà  usare  per  operare  sugli  elemenQ  XMLType;  avrà  però  conseguenze  sulle  prestazioni  delle  query.  Non  è  possibile  definire  una  delle  due  modalità  di  storage  come  ‟superiore”:  per  oNenere  le  prestazioni  migliori,  è  necessario  provare  caso  per  caso.  

XQuery  in  DB2,  Oracle  e  SQL  Server  

Oracle  DB:  Inserimento  di  daQ  XML  in  una  tabella  

Per  inserire  daQ  all'interno  di  una  tabella  o  di  una  colonna  XML,  si  usa  la  funzione    XMLType  all'interno  di  un  comando  INSERT,  passandole  il  frammento  XML  che  si    vuole  inserire.  

Esempio: INSERT INTO departments VALUES (XMLType ('<depts> <dept deptno="10" dname="Administration"/> <dept deptno="20" dname="Marketing"/> <dept deptno="30" dname="Purchasing"/> <dept deptno="40" dname="Publishing"/> <dept deptno="50" dname="Transport"/> </depts>'))

XQuery  in  DB2,  Oracle  e  SQL  Server  

Oracle  DB:  Esempio  di  query  e  differenze  da  DB2  Mostriamo  una  query  che  avevamo  già  eseguito  in  DB2:  le  differenze  sono  davvero  poche.  In  questo  esempio  vogliamo  estrarre  il  nome  e  lo  sQpendio  di    tua  gli  impiegaQ  con  sQpendio  superiore  a  50000,  ordinaQ  dal  meno  pagato  al    più  pagato.  

Esempio di XQuery SELECT XMLQUERY

('for $e in //emp where $e/@salary > 50000 order by $e/@salary return <empSalary>{ $e/@ename }{$e/@salary}</empSalary>' passing etable.object_value returning content)

FROM employees etable

A  parte  alcune  piccole  differenze  nella  clausola  passing  e  l'aggiunta  della  clausola  returning  content,  il  sistema  di  query  è  sostanzialmente  lo  stesso  di  DB2.  

XQuery  in  DB2,  Oracle  e  SQL  Server  

Oracle  DB:  Esempio  di  join  Mostriamo  una  query  in  cui  si  effeNua  il  join  tra  due  tabelle  XML:  anche  in  questo    caso,  la  sintassi  è  estremamente  simile  a  quella  uQlizzata  in  DB2.  Lo  scopo  della    query  è  estrarre  tua  gli  impiegaQ  che  lavorano  nel  diparQmento  chiamato    ‟Purchasing”.  

Esempio di XQuery con join SELECT XMLQUERY

('for $e in $elist//emp let $d := $dlist//dept[@dname = "Purchasing"] where $e/@deptno = $d/@deptno return $e' passing etable.object_value as "elist",

dtable.object_value as "dlist" returning content) FROM employees etable, departments dtable

XQuery  in  DB2,  Oracle  e  SQL  Server  

DB2:  Operare  direNamente  sui  documenQ  XML  

Se  non  si  vuole  inserire  i  daQ  dentro  delle  tabelle,  è  possibile  uQlizzare  la  funzione  doc()  per  effeNuare  query  direNamente  su  file  XML.  Vediamo  un  esempio  della  stessa  query  vista  poco  fa,  ma  questa  volta  applicata  al  file  employees.xml.  

SELECT XMLQUERY ('for $e in doc(‟employees.xml”)//emp where $e/@salary > 50000 order by $e/@salary return <empSalary>{ $e/@ename }{$e/@salary}</empSalary>' returning content)

FROM DUAL

La  tabella  DUAL  è  presente  di  default  in  tua  i  database  Oracle,  ed  è  vuota:  serve  solamente  ad  ovviare  al  faNo  che  la  clausola  FROM  è  obbligatoria  in  tuNe  le  query  SQL,  anche  nel  caso  in  cui  i  daQ  vengano  presi  tramite  altri  mezzi  (come,  in  questo  caso,  la  funzione  doc()  ).  

XQuery  in  DB2,  Oracle  e  SQL  Server  

XQuery in SQL Server 2012

SQL  Server:  Versione  di  XQuery  supportata  

l   Microsor  SQL  Server  supporta  solo  un  soNoinsieme  delle  funzionalità  di  XQuery,  basandosi  sulla  Working  Drar  del  2004  dello  standard.  

 l   Di  seguito  vedere  quali  sono  le  funzionalita‘non  implementate  da  questo  sistema.  

XQuery  in  DB2,  Oracle  e  SQL  Server  

SQL  Server:  Sequenze  e  Path  

Per  quanto  riguarda  le  Sequenze,  sono  da  segnalare  le  seguenQ  limitazioni:  l   Le  sequenze  devono  essere  omogenee,  quindi  possono  essere  composte  solo  da  nodi  o  da  valori  atomici;  

l   Non  è  supportato  il  costruNo  to  per  costruire  le  sequenze;  l   Non  è  possibile  usare  gli  operatori  union,  intersect,  except  per  combinare  sequenze  formate  da  nodi.  

Le  Path  Expressions  sono  supportate,  ma  non  del  tuNo:  l   Si  possono  uQlizzare  solo  gli  assi  child,  descendant,  parent,  aUribute,  self,  descendant-­‐or-­‐self;  

l   Sono  supportaQ  solo  i  Qpi  di  nodo  comment(),  node(),  processing-­‐instruc=on(),  text().  

XQuery  in  DB2,  Oracle  e  SQL  Server  

SQL  Server:  Espressioni  FLWOR  

 Le  espressioni  FLWOR  sono  interamente  supportate.    l   E'  da  segnalare  che  in  SQL  Server  2008  R2  le  espressioni  assegnate  ad  una  variabile  tramite  una  clausola  LET  verranno  inserite  nelle  query  ogni  volta  che  la  variabile  sarà  referenziata  al  suo  interno.  

 l   Questo  significa  che  l'espressione  non  verrà  eseguita  una  volta  sola,  ma  verrà  ricalcolata  ogni  volta  che  si  farà  riferimento  a  quella  variabile.  

XQuery  in  DB2,  Oracle  e  SQL  Server  

SQL  Server:  Altre  funzionalità  

Altri  operatori  supportaQ  sono:    l   Costrua  condizionali  if-­‐then-­‐else;  l   Operatori  di  confronto;  l   Operatori  logici  (solo  and  e  or:  not  è  disponibile  come  funzione);  l   Tua  gli  operatori  aritmeQci  ecceUo  idiv;  l   TuNe  le  funzioni  aggregate;  l   Espressioni  con  quanQficatori  esistenziali  ed  universali  (some/saOsfies  e  every/saOsfies).  

XQuery  in  DB2,  Oracle  e  SQL  Server  

SQL  Server:  Creazione  di  una  tabella  XML  

Come  per  DB2,  per  operare  su  daQ  XML  dobbiamo  per  prima  cosa  creare  una  tabella  adaNa  a  contenerli.  Per  fare  ciò,  è  sufficiente  inserire  al  suo  interno  una  colonna  di  Qpo  XML.  

Esempio di tabelle CREATE TABLE employees(

col1 int primary key, data XML)

CREATE TABLE departments(

col1 int primary key, data XML)

XQuery  in  DB2,  Oracle  e  SQL  Server  

SQL  Server:  Inserimento  di  daQ  XML  in  una  tabella  

Per  inserire  daQ  nella  tabella  che  abbiamo  appena  creato,  è  sufficiente  inserire  una  stringa  contenente  il  frammento  XML  nell'operazione  INSERT.  

Esempio di insert INSERT INTO departments VALUES (1, ('<depts> <dept deptno="10" dname="Administration"/> <dept deptno="20" dname="Marketing"/> <dept deptno="30" dname="Purchasing"/> <dept deptno="40" dname="Publishing"/> <dept deptno="50" dname="Transport"/> </depts>'))

XQuery  in  DB2,  Oracle  e  SQL  Server  

SQL  Server:  differenze  da  DB2  ed  OracleDB  Mostriamo  la  stessa  query  che  avevamo  effeNuato  per  DB2  e  OracleDB:  vogliamo  estrarre  nome  e  sQpendio  degli  impiegaQ  che  guadagnano  più  di  50.000,  ordinaQ  per  sQpendio.  

Esempio di XQuery: SELECT data.query

('for $e in //emp where $e/@salary > 50000 order by $e/@salary return <employee>{ $e/@ename }{$e/@salary}</employee>')

AS result FROM employees

A  parte  alcune  variazioni  nel  passaggio  dei  daQ  (invece  di  uQlizzare  una  clausola  passing,  applichiamo  direNamente  la  funzione  query()  alla  colonna  XML  ‟data”  contenuta  nella  tabella  employees),  la  sintassi  è  sempre  la  solita.  

XQuery  in  DB2,  Oracle  e  SQL  Server  

XQuery in Oracle Berkeley DB XML

Oracle  Berkeley:  un  insieme  di  librerie  

l  Oracle  Berkeley  non  è  un  vero  e  proprio  DBMS,  ma  un  insieme  di  librerie  che  possono  essere  uQlizzate  da  tua  i  più  comuni  linguaggi  di  programmazione  per  gesQre  con  semplicità  database  XML.  

 l  Oracle  Berkeley  non  fornisce  nessun  supporto  per  database  relazionali.    l   E'  possibile  operare  anche  tramite  un'interfaccia  testuale  che  interpreta  direNamente  alcuni  comandi  (come  negli  esempi  che  mostreremo  in  seguito).  

XQuery  in  DB2,  Oracle  e  SQL  Server  

Oracle  Berkeley:  Operazioni  principali  

l  L'oggeNo  fondamentale,  in  Oracle  Berkeley,  è  il  container  (vagamente  paragonabile  alle  tabelle  dei  DBMS  relazionali).  

 l  Una  volta  creato  un  container,  è  possibile  inserirvi  dei  documenQ  XML.    l  E'  possibile  recuperare  dei  frammenQ  XML  da  un  container  effeNuando  un'interrogazione  XQuery.  

 l  Si  può  uQlizzare  XML  Schema  per  inserire  dei  constraint  (vincoli)  sui  documenQ.    l  E'  anche  possibile  creare  degli  indici  che  aumenQno  le  prestazioni.  

XQuery  in  DB2,  Oracle  e  SQL  Server  

Oracle  Berkeley:  Creazione  di  un  container  

E'  possibile  scegliere  due  Qpi  diversi  di  memorizzazione:  l   per  documento:  i  documenQ  vengono  salvaQ  esaNamente  come  sono  staQ  daQ  al  sistema;  l   per  nodi:  i  documenQ  vengono  scomposQ  nei  nodi  che  li  formano,  che  vengono  poi  salvaQ  separatamente.    La  memorizzazione  per  nodi  dà  la  possibilità  di  modificare  il  documento  in  futuro,  e  garanQsce  prestazioni  migliori.  

Esempio  (tramite  console):  

dbxml> createContainer esempio.dbxml

XQuery  in  DB2,  Oracle  e  SQL  Server  

Oracle  Berkeley:  Inserire  un  documento  

Per  inserire  documenQ  nel  container  corrente  si  uQlizza  l'operazione    ‟putDocument  <namePrefix>  <string>  [f|s|q]”.    l   MeNere  ‟f”  come  terzo  parametro  indica  che  la  stringa  conQene  il  path  del  file  XML  che  si  vuole  inserire.  l   MeNere  ‟s”  come  terzo  parametro  indica  che  la  stringa  conQene  il  frammento  XML  che  si  vuole  passare.  

Esempi  (tramite  console):  

dbxml> putDocument book1 '<book><title>Title1</title><author>Author1</author><pages>100</pages></book>' s dbxml> putDocument book1'Document.xml' f

XQuery  in  DB2,  Oracle  e  SQL  Server  

Oracle  Berkeley:  query  Per  recuperare  i  documenQ  inseriQ  dei  container,  si  effeNuano  interrogazioni  XQuery.  Oracle  Berkeley  effeNuerà  la  ricerca  su  tua  i  documenQ  contenuQ  nel  container.  

Esempi  (tramite  console):  

Restituire l'intero contenuto della collezione: dbxml> query 'collection("esempio.dbxml")' Restituire il titolo di tutti i libri che abbiano John come autore: dbxml> query 'collection("esempio.dbxml")/book[author="John"]/title' Restituire il titolo di tutti i libri con prezzo maggiore di 100: dbxml> query 'for $book in collection("esempio.dbxml") where $book/price > 100 return $book/title'

XQuery  in  DB2,  Oracle  e  SQL  Server  

Oracle  Berkeley:  vincoli  

l   Durante  la  creazione  di  un  container,  è  possibile  legare  ad  un  documento  XML  uno  schema;  in  questo  modo,  si  potranno  inserire  soltanto  documenQ  XML  che  superino  la  validazione  con  quello  schema.    l   E'  anche  possibile  specificare  vincoli  diversi  per  documenQ  diversi,  all'interno  dello  stesso  container.  

XQuery  in  DB2,  Oracle  e  SQL  Server  

Appendice: Installare i DBMS

Installazione  DB2  

l   Dal  sito  hNp://www-­‐01.ibm.com/sorware/data/db2/  è  possibile  effeNuare  il  download  dei  sorware  necessari  all'esecuzione  di  DB2.    l   La  versione  gratuita  del  DBMS  è  chiamata  ‟DB2  Express-­‐C”.    l   Dal'indirizzo  hNp://www.ibm.com/developerworks/downloads/im/data/  è  possibile  scaricare  IBM  Data  Studio,  un'interfaccia  grafica  gratuita  estremamente  uQle  per  effeNuare  qualunque  Qpo  di  operazione.  

XQuery  in  DB2,  Oracle  e  SQL  Server  

Installazione  di  Oracle  XML  

l   Dal  sito  www.oracle.com,  nella  sezione  Downloads,  è  possibile  scaricare  gratuitamente  Oracle  Database  11g,  che  conQene  anche  Oracle  XML.    l   Anche  in  questo  caso  è  necessaria  un'interfaccia  grafica  per  interagire  in  maniera  semplice  con  il  DBMS:  si  chiama  Oracle  SQL  Developer,  anche  questa  scaricabile  dalla  sezione  Downloads  di  www.oracle.com.  

XQuery  in  DB2,  Oracle  e  SQL  Server  

Installazione  di  Microsor  SQL  Server  2012  

l   Dal  sito  hNp://www.microsor.com/sqlserver  è  possibile  scaricare  MS  SQL  Server  2012  Express,  una  versione  gratuita  del  DBMS.    l   Scegliendo  il  paccheNo  di  download  Express  with  Tools,  verrà  installata  anche  l'interfaccia  grafica  SQL  Server  Management  Studio  Express.  

XQuery  in  DB2,  Oracle  e  SQL  Server  


Recommended