tirsdag den 23. december 2008

XQuery for SQL programmør ?" Opdatering af din database

I today? � s post we? � ll viser, hvordan du opdaterer din relationel database ved hjælp af XQuery. Som for alle stillinger i denne række we? � ll start med SQL opgørelser, og viser den tilsvarende xqueries.

XQuery Update Facility er en kommende W3C standard, der i øjeblikket er i Candidate henstilling status. Den XQuery Update Facility udvider XQuery 1.0 og gør det muligt at ændre XML. Men i dag vil vi ikke gå i detaljer med denne kommende standard. Vi vil dog vise, hvordan XQuery giver dig mulighed for at opdatere din rdbms, på samme måde som SQL gør, ved at bruge DataDirect XQuery opdatering funktionalitet .

Dybest set DataDirect XQuery introducerer 3 nye XQuery funktioner,

Du sandsynligvis allerede se analogt med SQL? � s INSERT, opdatere og DELETE erklæringer, tid til nogle eksempler.

Indsættelse af rækker

Følgende SQL-sætning, skaber en ny bruger, Joe Roxy,

 INSERT INTO brugere (UserID, NAVN) værdier ( 'U10', 'Joe Roxy ') 

De XQuery variant er meget ens,

 ddtek: SQL-insert ( "brugere", "UserID", "U10", "Navn", "Joe Roxy" ) 

Det første argument peger på bordet, som vi ønsker at indsætte ind. Næste ddtek: SQL-insert har en variabel liste over kolonne-værdi-par.

A "INSERT INTO vælge" er en smule mere detaljeret i XQuery, end det er tilfældet i SQL.

 Indsætte i NEWUSERS vælge * Fra brugere, hvis navn såsom "Tom% '

I XQuery du ville skrive,

 for $ bruger i indsamling (" brugere ")/USERS 
hvor begynder - med ($ bruger/navn "Tom")
vende tilbage
ddtek: SQL-insert ( "OTHERUSERS",
"UserID", $ bruger/UserID,
"NAME" , $ Bruger/NAVN,
"menig", $ bruger/rating)

Sletning af rækker

Alder � � s nu slette Joe Roxy fra user? � s tabellen,

 slette fra brugere, hvor UserId = 'U10' 

Med DataDirect XQuery du bruger ddtek: SQL-slette. Du kan vælge alle de brugere, du vil slette, ved vi, hvordan vi kan gøre det,

 indsamling ( "brugere")/brugere [UserID = 'U10'] 

Og nu du passerer, at oplysninger som argument for at ddtek: SQL-slette,

 ddtek: SQL-slette (indsamling ( "brugere")/brugere [UserID = 'U10'])

Og selvfølgelig, hvis du har en præference for FLWOR udtryk, således svarer,

 for $ u i indsamling ( "TESTUSERS")/TESTUSERS 
hvor $ u/UserID = 'U10'
vende tilbage
ddtek: SQL-slette ($ u)

Opdatering rækker

Alder � � s nu vise, hvordan man kan opdatere elementet 1001, ændre sin beskrivelse til Grøn Cykel og pris = 100,

 opdatering ITEMS 
sæt BESKRIVELSE = 'Green Bicycle', RESERVE_PRICE = �100�
hvor ITEMNO ='1001 '

Lignende at slette rækker, skal du først nødt til at angive, hvilke rækker, der skal opdateres, og videregive det som argument for at ddtek: SQL-opdateringen.

 for $ punkt i indsamling ( "poster")/ITEMS 
hvor $ post/ITEMNO ='1001 '
vende tilbage
ddtek: SQL-update ($ post,
"Beskrivelse", " Green Bicycle ",
" RESERVE_PRICE ", 100)

Ligesom i SQL, kan du opdatere en kolonne med en værdi beregnet fra den nuværende værdi. Antag at vi ønsker at hæve prisen reserve for alle poster med 10%. Som det fremgår af følgende SQL-sætning,

 Update "xvs". "Xvs001". "Poster" SET "RESERVE_PRICE" = "RESERVE_PRICE" * 1.10 

Og i XQuery,

 for $ element i indsamling ( "poster")/ITEMS 
vende tilbage
ddtek: SQL-update ($ post, "RESERVE_PRICE", $ post/RESERVE_PRICE * 1.10)

Upsert?

Flere SQL implementeringer støtte upsert eller fusionere funktionalitet. Det gør det muligt at opdatere et mål tabel med data fra en kilde bordet. Rækker i målet, der passer til den kilde er opdateret, og den ikke eksisterende rækker indsættes. XQuery ikke har en sådan indbygget funktion, men der er heller ikke behov for. Brug en betinget udtryk, det er let udtrykt i XQuery.

Antag at vi ønsker at kopiere alle brugere med rating A fra den ene til den anden tabel. Hvis brugeren findes, vi opdaterer rækken, ellers har vi Indsæt.
Vi Gentag over alle rækkerne i BRUGERE tabellen med rating A, og opslag matchende række i NEWUSERS bordet.
Hvis en kamp i NEWUSERS er fundet, vi opdaterer rækken, ellers der indsættes en ny række,

 for $ kilde i indsamling ( "brugere")/USERS 
lad $ mål: = indsamling ( "NEWUSERS")/NEWUSERS [UserId = $ kilde/UserID]
hvor $ kilde/rating = "A"
vende tilbage
hvis (eksisterer ($ target)) derefter
ddtek: SQL-update ( $ mål,
"NAME", $ source/NAVN,
"menig", $ source/rating)
ellers
ddtek: SQL-insert ( "NEWUSERS",
"UserID", $ source/UserID,
"NAME", $ source/NAVN,
"menig", $ source/rating)

NULL værdier

Hvad lærte vi i Data Model , i SQL/XML opfattelse, NULL værdier område repræsenteret som manglende elementer. Lignende, til at videregive NULL til en af de ddtek: SQL-* funktioner, skal du angive den tomme sekvens.

Setting en Itema � � s beskrivelse til null i SQL,

 opdatering ITEMS 
sæt BESKRIVELSE = NULL
hvor ITEMNO ='1001 '

Opdatering af en kolonne med NULL, er ikke meget anderledes i XQuery,

 for $ element i indsamling ( "ITEMS ")/ITEMS 
vende tilbage ddtek: SQL-update ($ post," Beskrivelse ", ())

Alle opdateringen eksempler i denne post enten bruge statiske data (literals) eller er ved kopiering af data fra den ene til den anden tabel. Men i de fleste scenarier disse data kommer ud af din ansøgning i en eller anden måde.

Med DataDirect XQuery du har evnen til at læse data fra en XML-struktur og opdatere din database. Minollo og jeg har blogges om dette emne før i Bulk belastning af XML-data i en relationel database og shredding XML-dokumenter til tabeller, en database uafhængig tilgang ....

Som bekendt i SQL, binder markører letter bindende værdier fra din ansøgning til SQL-sætning. Hvad er det, der svarer til SQL binde markører i XQuery? Hold øje med om vores næste post i XQuery for SQL programmør Serie.

Tech Tags: