Dnes: 24. února 2017    | Registrace | Hledáme | Redakce | Info | Testy | Školení | Ocenění | Nápověda | Čtenář: nepřihlášen

Rychlé odkazy
  • Hlavní stránka
  • Seznam rubrik
  • Ankety
  • Editoriály
  • TOP 15
  • KONFERENCE 2008
  • KONFERENCE 2007
  • KONFERENCE 2006
  • KONFERENCE 2005
  • KONFERENCE 2004
  • Sborník
  • Testy
  • Virtuální školení
  • Personalizace


  • Hledáte práci?
    Hledáme redaktora - pojďte s námi tvořit Databázový svět!

    Vyhledávání

    Hledej
    na Databázovém světě!



    Rozšířené vyhledávání

    Rubriky
    Aktuality
    Bezpečnost
    Business
    Česká scéna
    Datové sklady
    Dokumentace
    Dotazovací jazyky
    Hardware
    Historie
    Komentáře
    Literatura
    Metodologie
    Nondb
    Open Source
    Poradna
    Produkty
    Případové studie
    Redakce
    Rozhovory
    Standardy
    Technologie
    Tipy - triky
    Tiskové zprávy
    Vývoj
    Vývojové nástroje
    Zajímavosti

    Co je to?
    Replikace
    Replikace slouží pro zajištění konzistentnosti dvou a více databází, nejčastěji pak o stejné struktuře v rámci distribuovaného zpracování. Vyspělé SŘBD replikace podporují, případně lze použít řešení třetích stran či replikační logiku zajistit vlastními postupy.

    Akce
    Dynamická Datová Centra
    - na semináři se seznámíte s komplexním řešením a koncepcí Dynamických Datových Center od Fujitsu Siemens Computers se speciálním důrazem na řešení FlexFrame.

    Textová inzerce
    IBPhoenix - Vše o InterBase a Firebirdu.

    Smějete se rádi? - Pak je pro vás Vtipník to pravé!

    Prodejce reklamy - Hledáme schopného prodejce reklamního prostoru, možnost i externí spolupráce.

    Přihlášený čtenář
    Nepřihlášený čtenář

    O portálu
    Databázový svět
    ISSN: 1213-5933

    Web je optimalizován pro rozlišení 1024x768, nicméně kromě větších rozlišení podporujeme i 800x600. Podrobnosti najdete zde.

    Chcete-li mít kdykoliv možnost zkontrolovat obsah našeho portálu, můžete využít podporu rss. Podrobnosti najdete zde.
    Jak na dynamické dotazy ve Firebirdu?


    [Dotazovací jazyky] - Uvažovali jste někdy nad tím, jak celý dotaz nebo případně jakýkoli jiný databázový příkaz seskládat z jiných částí – například proměnných – a teprve poté jej nechat provést? Pokud ano, tak právě pro vás jsou vhodné tzv. dynamické dotazy. V tomto článku si ukážeme praktické příklady na platformě Firebird. Většina slušných databázových strojů poskytuje podobné možnosti, takže i příznivci jiných databázových platforem si přijdou na své.



    Můžete namítnout, že dotazy vytváříte v aplikaci a tak není problém je sestavit k obrazu svému předem. Ale co když potřebujete takovýto příkaz vytvořit na základě jiných dat a to třeba přímo na serveru?

    Opět lze namítnout, že za where podmínkou přece můžete dávat jak je libo, ale přece – co když chcete opravdu celý – úplně celý – příkaz vytvořit pomocí jiných a předem neznámých částí? Potom jsou tu dynamické dotazy.

    Jak již bylo řečeno, občas je potřeba vytvořit příkaz jazyka SQL z předem neznámých zdrojů a tento nad danou databází spustit. Nejčastěji se tato kombinace používá v uložených procedurách (stored procedures, SP). Jako motivační příklad nám může posloužit takovéto zadání:

    V rámci jednoho příkazu/akce vypište počet řádků ze všech tabulek v databázi.

    Pokud nechcete vypisovat všechny tabulky, případně chcete aby postup fungoval i po přidání další tabulky bez zásahu, musíte použít nástroj, který vám poskytne volnost při tvorbě příkazu.

    Ukažme nejprve jednoduché řešení a poté si jej rozeberme.

    CREATE PROCEDURE BIG_DATA 
    RETURNS (
        RESULT BIGINT)
    AS
    DECLARE VARIABLE TMP_COUNT INTEGER;
    DECLARE VARIABLE TAB CHAR(31);
    begin
      result = 0;
      for select RDB$RELATION_NAME 
        from RDB$RELATIONS 
        where RDB$SYSTEM_FLAG = 0 and RDB$VIEW_BLR is null
      into tab
      do begin
        execute statement 'select count(*) from ' || :tab || ';' into tmp_count;
        result = result + tmp_count;
      end
      suspend;
    end
    

    Nejprve je klasická definice procedury. Poté následuje výběr všech tabulek z databáze (pokud vám tento dotaz není jasný, nezoufejte není to pro pochopení důležité). Poté již následuje výběr počtu řádků z každé z těchto tabulek. Zde si všimněte magického příkazu execute statement, který zajišťuje vykonání onoho dotazu.

    Jako svůj jediný parametr tento příkaz připouští textový řetězec, který má být vykonán. Zbytek je stejný jako příkaz select, resp. for select ... do (příkaz je dostupný v uložených procedurách a triggerech).

    Ukázkové využití je opravdu ukázkové, s ním se setkáte nejčastěji. Co se však není až tak známo je fakt, že execute statement přijme jako svůj parametr libovolný SQL příkaz. Co to znamená? Jednoduše – můžete tímto sestavit a následně spustit prakticky cokoli,c o vás napadne. Od jednoduchých dotazů přes inserty až po komplexní příkazy pro update dat. Aby nezůstalo jen u mluvení, ukažme si další příklad.

    CREATE PROCEDURE DATA_ACTION 
    AS
    DECLARE VARIABLE DATA INTEGER;
    DECLARE VARIABLE TABULKA VARCHAR(12);
    begin
      for select tabulka, data 
        from akce_tabulka into :tabulka, :data do
      begin
        execute statement 'insert into ' || :tabulka || 
                          ' values (''' || :data || ''');';
      end
      suspend;
    end
    

    Zde už je méně obvyklé použití konstrukce execute statement. Předpokládejme, že máme tabulku akce_ tabulka obsahující jméno tabulky a data, která se mají vložit. Jednoduchou konstrukcí opět krásně vložíme požadovaná data do tabulky. Pokud by je bylo třeba ještě upravit nebo ověřit, není problém toto v proceduře provést. Bez existence toho příkazu by to šlo jen velmi obtížně.

    Jak vidíte, není problém za pomoci (téměř) magické konstrukce execute statement provádět jakékoli operace. Můžete klidně napsat proceduru, která vám pro danou tabulku jako výstup připraví textový SQL dump pro přenos na jiné místo.

    Pozorné čtenáře jistě napadlo, zda-li tento příkaz má dramatický dopad na výkon. A opět, aby nezůstalo jen u teorie, rozhodli jsme se provést test. Vytvořili jsme testovací tabulku a do ní jsme postupně přidali sto tisíc záznamů. Jednou pomocí "normálního" insertu, podruhé pomocí execute statement. Abychom zamezili spekulacím s výkonem stroje, provedli jsme pro každou verzi sedm pokusů a nejlepší a nejhorší jsme vyřadili (pět platných). Po každém testu jsme se snažili databázový engine uvést do (pokud možno) stejné výchozí pozice. Jako testovací stroj posloužil redakční notebook (takže zápisy na disk jsou pomalejší, ale pro obě procedury stejně "drahé").

    Výsledky nejsou zas až tak nečekané – průměrný čas pro dynamické dotazy byl 40 sekund, pro statické dotazy 28 sekund. Čas pro potvrzení / odvolání transakcí nebyl započítán.

    Letmým pohledem zjistíme, že čas potřebný ke zpracování execute statementu tu je, avšak není nějak velký (přibližně 30%). K celkovému výsledku je nutné ještě připočíst fakt, že s execute statement máte de facto naprostou svobodu při programování na straně databáze. Pokud uvážíte, jak nestandardní úloha toto byla, není to vůbec špatný výsledek.

    Nic tedy nebrání, aby byly dynamické dotazy v – rozumné míře – používány jako běžný příkaz bez výrazného (mnohdy) dopadu na výkon celého databázového stroje. Nakonec ještě dodejme, že příkaz execute statement byl přidán ve Firebird verze 1.5.

    Máte-li dotaz či připomínku, neváhejte se zeptat v našem diskusním fóru.

    ( Celý článek! | Autor: Jiří Činčura | Počet komentářů: 0 | Přidat komentář | Informační e-mailVytisknout článek )

    Vyhledávání
     

    Anketa
    Kolik ročně utratíte za dovolené?

    Nic 
     (958 hl.)
    Do 1 000,- Kč 
     (757 hl.)
    Do 10 000,- Kč 
     (718 hl.)
    Do 25 000,- Kč 
     (852 hl.)
    Do 50 000,- Kč 
     (745 hl.)
    Do 75 000,- Kč 
     (777 hl.)
    Více než 75 000,- Kč 
     (732 hl.)

    Celkem hlasovalo: 5539


    Poslední komentáře
    frontierd@126.com
    frontierd@126.com
    frontierd@126.com
    c
    http://www.coachoutl

    Newsletter
    Přihlaste si nezávazně - i bez registrace - odběr informačního newsletteru. Podrobné informace najdete zde.

    Emailová adresa:


    Kalendář
    <<  Únor  >>
    PoÚtStČtSoNe
      12345
    6789101112
    13141516171819
    20212223242526
    2728     

    Redakci připojuje


    Nejčtenější

    Databáze je prázdná!


    Nejvíce komentářů

    Databáze je prázdná!


    Reklama






    Nenechte si ujít články na dalších webech




    Na této stránce použité názvy programových produktů, firem apod. mohou být ochrannými známkami
    nebo registrovanými ochrannými známkami příslušných vlastníků.

    Databázový svět | dfKlub - digitální fotografie | Vtipník - vtipy přímo k Vám | Reminder - přestaňte zapomínat | Databázový svět

    Copyright (c) 2004 AVRE Publishing, spol. s r.o. Všechna práva vyhrazena