602SQL-Úplná dokumentace Index  

Přenosy dat z relačně propojených tabulek

Pokud se přenosu dat účastní více databázových tabulek, jejich začlenění do DAD se liší podle toho, zda jde o syntetický nebo analytický DAD.

Export dat z více tabulek v syntetickém DAD

Syntetický DAD dovoluje exportovat do XML data z odpovědi na libovolný dotaz, který lze zapsat v jazyce SQL. Dotaz může kombinovat data pocházející z řady tabulek.

Navržený dotaz je zapsán do DAD mezi globální parametry. Při exportu se tento dotaz nejprve pošle SQL serveru a pak se čtou data z odpovědi a transformují do XML souboru.

Klientský aplikační program může parametrizovat DAD a tím vybrat pro export pouze data splňující určité podmínky.

Klientský aplikační program může také otevřít kurzor se stejnou strukturou sloupců, jako dotaz zapsaný v DAD, a předat ho funkci pro export do XML. V tomto případě se exportují data z kurzoru a dotaz zapsaný v DAD se ignoruje.

Pokud struktura vytvářeného XML souboru má odpovídat relačním vztahům v databázi (je-li záznam Z reprezentován elementem E, pak záznamy relačně připojené k Z jsou reprezentovány elementy obsaženými v E), lze použít metodu vytknutí stejných hodnot před opakující se element.

Mimo to lze do syntetického DADu relačně připojovat další tabulky stejně, jako v níže popsaném analytickém DADu.

Příklad

Uvažujme trojici tabulek Customers, Orders a OrderLines. Vztah 1:N je mezi tabulkami Customers a Orders (zákazník může mít vícero objedávek) a mezi tabulkami Orders a OrderLines (objednávka může mít vícero položek).

V tabulkách jsou tyto sloupce a tato data:
CustomersOrdersOrderLines
ID_CUST FIRST_NAME SURNAME
0 John Smith
1 Peter White
2 Charles Black
ID_ORD ID_CUST
0 0
1 0
2 1
ID_ORDLIN ID_ORD ITEM
0 0 paper
1 1 pencil
2 1 diskette
3 2 toner

Dotaz přirozeně propojující obsah tabulek může vypadat takto:

SELECT *
FROM Customers JOIN 
        Orders JOIN OrderLines 
        ON (Orders.id_ord=OrderLines.id_ordlin) 
     ON (Customers.id_cust=Orders.id_cust)

DAD pro export vybraných sloupců může vypadat takto (v příkladech XML je pod jménem Join synth 1):

i XML TOP: SELECT * FROM Customers JOIN ....
E <list>
  E <customer> TABLE - base cursor -
    E <surname> 
      Tx surname
    E </surname>
    E <order> 
      E <order_id> 
        Tx id_ord
      E </order_id>
      E <item> 
        E <item_id>
          Tx id_ordlin 
        E </item_id>
        E <commodity> 
          Tx item
        E </commodity>
      E </item>
    E </order>
  E </customer>
E </list>

Exportem vznikce XML soubor ve tvaru:

<?xml version="1.0" encoding="UTF-8"?>
<list>
 <customer>
  <surname>Smith</surname>
  <order>
   <order_id>0</order_id>
   <item>
    <item_id>0</item_id>
    <commodity>paper</commodity>
   </item>
  </order>
 </customer>
 <customer>
  <surname>Smith</surname>
  <order>
   <order_id>1</order_id>
   <item>
    <item_id>1</item_id>
    <commodity>pencil</commodity>
   </item>
  </order>
 </customer>
 <customer>
  <surname>Smith</surname>
  <order>
   <order_id>1</order_id>
   <item>
    <item_id>2</item_id>
    <commodity>diskette</commodity>
   </item>
  </order>
 </customer>
 <customer>
  <surname>White</surname>
  <order>
   <order_id>2</order_id>
   <item>
    <item_id>3</item_id>
    <commodity>toner</commodity>
   </item>
  </order>
 </customer>

V DAD souboru však můžeme umožnit vytknutí stejných hodnot (v příkladech XML je pod jménem Join synth 2):

...
    E <order> Multi_occurence
...
      E <item> Multi_occurence
...

Tím získáme lépe strukturovaný XML soubor přesněji reprezentující strukturu dat v databázi:

<?xml version="1.0" encoding="UTF-8"?>
<list>
 <customer>
  <surname>Smith</surname>
  <order>
   <order_id>0</order_id>
   <item>
    <item_id>0</item_id>
    <commodity>paper</commodity>
   </item>
  </order>
  <order>
   <order_id>1</order_id>
   <item>
    <item_id>1</item_id>
    <commodity>pencil</commodity>
   </item>
   <item>
    <item_id>2</item_id>
    <commodity>diskette</commodity>
   </item>
  </order>
 </customer>
 <customer>
  <surname>White</surname>
  <order>
   <order_id>2</order_id>
   <item>
    <item_id>3</item_id>
    <commodity>toner</commodity>
   </item>
  </order>
 </customer>
</list>

Pokud bychom z exportu do XML souboru vypustili číslo objednávky id_ord (v příkladech XML je takový DAD pod jménem Join synth 3), pak by v XML souboru splynuly položky z různých objednávek stejného zákazníka - nebylo by možno rozlišit, zda dvě položky byly objednány pomocí jedné nebo dvou objednávek.

Pokud v XML souboru nechceme mít číslo objednávky, ale přesto bychom chtěli, aby položky z různých objednávek byly v různých výskytech elementu order, bylo by nutno v parametrech elementu order nastavit Opakovat při změně sloupce id_ord.

...
    E <order> Multi_occurence REPEAT ON CHANGE IN id_ord
...

V příkladech XML je takový DAD pod jménem Join synth 4.

Práce s množinou tabulek v analytickém DAD

Analytický DAD obsahuje odkazy na tabulky v elementech podle tohoto pravidla: Tabulka T je uvedena v elementu E jako nově připojená tabulka, pokud každý výskyt elementu E odpovídá jednomu záznamu v tabulce T.

Druhá a další tabulky v pořadí zanořování v XML jsou relačně připojeny vždy na předchozí tabulku. Připojení je nutno popsat pomocí dvojice sloupců z nadřízené a podřízené tabulky obsahujících propojující klíč. Dále je nutno předepsat setřídění záznamů podle klíče nadřazené tabulky.

DAD pro práci s výše uvedenou trojicí tabulek může vypadat takto (v příkladech XML je takový DAD pod jménem Join analyth):

i XML TOP
E <list>
  E <customer> TABLE Customers ORDER BY id_cust
    E <surname> 
      Tx Customers.surname
    E </surname>
    E <order> JOIN TABLE Orders ON Orders.id_ord=Customers.id_cust ORDER BY id_ord
      E <order_id> 
        Tx Orders.id_ord
      E </order_id>
      E <item> JOIN TABLE OrderLines ON OrderLines.id_ord=Orders.id_ord ORDER BY id_ordlin
        E <item_id>
          Tx OrderLines.id_ordlin 
        E </item_id>
        E <commodity> 
          Tx OrderLines.item
        E </commodity>
      E </item>
    E </order>
  E </customer>
E </list>

Tabulky Customers, Orders a OrderLines jsou připojeny po řadě v elementech customer, order a item.

Všechna jména sloupců použitá v návrhu musí být doprovázena jménem tabulky, protože různé tabulky mohou mít stejně pojmenované sloupce.

Při exportu vznikne XML soubor:

<?xml version="1.0" encoding="UTF-8"?>
<list>
 <customer>
  <surname>Smith</surname>
  <order>
   <order_id>0</order_id>
   <item>
    <item_id>0</item_id>
    <comodity>paper</comodity>
   </item>
  </order>
  <order>
   <order_id>1</order_id>
   <item>
    <item_id>1</item_id>
    <comodity>pencil</comodity>
   </item>
   <item>
    <item_id>2</item_id>
    <comodity>diskette</comodity>
   </item>
  </order>
 </customer>
 <customer>
  <surname>White</surname>
  <order>
   <order_id>2</order_id>
   <item>
    <item_id>3</item_id>
    <comodity>toner</comodity>
   </item>
  </order>
 </customer>
 <customer>
  <surname>Black</surname>
 </customer>
</list>

V souboru jsou uvedeni i zákazníci, kteří nemají žádnou objednávku (Black) - z toho je patrné, že při spojování tabulek se provádí OUTER JOIN.

Pomocí stejného DAD lze soubor importovat do tabulek v databázi. Předpokládejme, že pro export a import použijeme DAD obsahující všechny sloupce (v uváděném příkladu jsou kvůli stručnosti některé sloupce vynechány). Hodnoty relačně propojující záznamy (id_cust a id_ord) se při importu zapíší do všech tabulek tak, že relační vztah mezi záznamy bude obnoven.

Propojování tabulek pomocí klíčů obsahujících více než jeden sloupec

Relační vazba mezi tabulkami bývá někdy vyjádřena rovností klíčů, které se skládají z více než jednoho sloupce. V takovém případě v popisu připojení nové tabulky uveďte:

tvořící propojovací klíč.

Jména sloupců v seznamu oddělte čárkami. V obou seznamech musí být stejný počet sloupců a odpovídající si sloupce v seznamech musí být stejného typu. Pokud by jméno některé sloupce obsahovalo čárku, uveďte je v obrácených apostrofech.

Vícenásobný výskyt stejné tabulky

Ve výjimečných případech se jedna tabulka může v návrhu DAD vyskytnout i vícekrát. Pak je nutno odlišit jednotlivé výskyty.

Pro rozlišení výskytů tabulky slouží tzv. alias. Je to identifikátor, který se přiřadí výskytu tabulky v popisu toho elementu, v němž se tabulka připojuje do návrhu.

Pro všechny odkazy na tuto tabulku se pak místo jména tabulky používá její alias. Pokud se tedy každému výskytu tabulky v DAD přiřadí jiný alias, lze odkazy na výskyty snadno rozlišit.

Seznam subsekcí: