Dnes: 19. září 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.
    Tipy a triky pro Oracle XIII. – externí data rychle


    [Tipy - triky] - Ve třináctém pokračování seriálu věnovaného praktickým tipům a trikům pro databázovou platformu Oracle Database se podíváme na to, jak pomocí externích tabulek a tabulkových funkcí můžeme rychle nahrát do databáze data z externích souborů. Cílem seriálu je přinášet vám nejen praktické informace, které vám mohou pomoci při správě či vývoji na této platformě, ale také upozorňovat na zajímavé funkce. O kterých možná ani nevíte, že existují.



    Keď vytvárate dátové sklady alebo bežné aplikácie, často sa nevyhnete nutnosti nahrávať do databázy dáta z textových súborov. Ukážeme si ako pomocou externých tabuliek a tabuľkových funkcií tento proces vykonávať výrazne rýchlejšie než použitím zabehnutých postupov.

    Majme dáta z primárneho systému, ktoré chceme analyzovať. Budeme ich potrebovať nahrať do separátnej databázy, aby sme nezaťažovali primárny systém. Pravdepodobne ich budeme chcieť transformovať do štruktúr iných, ako boli uložené v zdroji.

    Klasický prístup by bol (viď obr.) :

    1. napísať riadiaci skript pre SQL*Loader (utilita na nalievanie externých dať do databázovej tabule), ktorý dáta 1:1 nahrá do dočasnej štruktúry (tzv. staging table).
    2. napísať PL/SQL procedúru, ktorá dáta načíta z dočasnej tabuľky, transformuje ich do požadovaného tvaru a uloží do cieľovej štruktúry.

    Pokiaľ nie sme úplne konzervatívni, môžeme skúsiť rýchlejší spôsob:

    1. nad externým súborom zadefinujeme externú tabuľu (nebudeme používať dočasnú tabuľu a proces kopírovania 1:1 do databázy)
    2. zadefinujeme tzv. tabuľovú funkciu, v ktorej bude zadefinovaná logika transformácie do cieľovej štruktúry.

    Použitím externej tabule ušetríme čas potrebný na prekopírovanie dát. Namiesto toho aby sme ich prekopírovali do dočasnej tabuľky a až následne spracovali pomocou SQL, môžeme dáta čítať priamo z textového súboru. Uľahčíme si aj administráciu vstupných dát. Keď dostaneme nový vstupný súbor, tak ho jednoducho nakopírujeme namiesto starého (počas výmeny samozrejme nikto nesmie k dátam pristupovať).

    Výhodou tabuľovej funkcie je, že vracia tabuľu, takže môžeme jednoducho urobiť príkaz SELECT * FROM TABLE(tabulova_fx(…)). Okrem jednoduchosti použitia sa dá "pipelinovať" tak, ako to poznáme napr. z unixového príkazového riadku. V našom prípade to znamená, že pokiaľ máme na vstupe milión riadkov, nemusí nasledujúca operácia čakať na spracovanie celej vstupnej sady, aby následne obdržala jeden veľký balík dát, ale postupne z funkcie bude vystupovať záznam po zázname tak, ako boli spracované, t.j. nebudú sa hromadiť v pamäti, ani ich nemusíme dočasne niekam ukladať, takže ich môžeme rovno spracovávať ďalej.

    Dosť bolo teórie, poďme na príklad (inšpirácia Tom Kyte). Od produktového managera dostaneme export z jeho desktopovej aplikácie na udržiavanie čísel a reťazcov vo forme CSV súboru, ktorý však nie je normalizovaný (neplatí jeden záznam - jeden riadok), takže nie je vhodný na priame umiestnenie do databázovej tabule. Skopírujeme ho napr. do adresára /tmp, resp. na Windows do c:\tmp.

    >more ext_produkty.csv
    
    1,"Pracka,Chladnicka,Sporak,Zehlicka",
    2,"Radio,TV,DVD,Sluchadla",
    

    Zadefinujeme si cestu k externému súboru a externú tabuľu nad ním, aby sme k dátam mohli pristupovať pomocou SQL príkazu.

    Najskôr sa prihláste ako užívateľ s právom CREATE ANY DIRECTORY (napr. užívateľ SYSTEM alebo SYS) a pridelíme práva na čítanie a zápis do adresára užívateľovi, pod ktorým budeme spúšťať samotné nahrávanie dát (napr. užívateľ HR). Práva na zápis sú nutné, lebo Oracle pri čítaní externej tabuľky vytvára log so štatistikami úspešnosti čítania súboru.

    -- Do úvodzoviek napíšte cestu k adresáru so vstupným súborom.
    CREATE OR REPLACE DIRECTORY ext_dir AS 'c:\tmp';
    
    GRANT READ, WRITE ON DIRECTORY ext_dir TO hr;
    

    Ďalšie operácie už robte pod užívateľom, pod ktorým budete spúšťať vlastné načítanie dát (napr. užívateľ HR).

    CREATE TABLE ext_table_csv (
      skupina_id NUMBER,   
      produkty VARCHAR2(255)
    ) 
      ORGANIZATION EXTERNAL (
        TYPE oracle_loader 
        DEFAULT DIRECTORY ext_dir 
        ACCESS PARAMETERS (
          RECORDS DELIMITED BY newline 
          FIELDS TERMINATED BY ',' 
          OPTIONALLY ENCLOSED BY '"' 
          MISSING FIELD VALUES ARE NULL
        ) 
        LOCATION('ext_produkty.csv')
      ) 
      REJECT LIMIT UNLIMITED;
    

    Môžeme si urobiť kontrolný dotaz na správnosť definície externej tabuľky.

    SELECT * FROM ext_table_csv;
    
    SKUPINA_ID    PRODUKTY
    -----------------------------------------------------------------
    1             Pracka,Chladnicka,Sporak,Zehlicka
    2             Radio,TV,DVD,Sluchadla
    

    Musíme zadefinovať typy (rozumej objekty), s ktorými budeme operovať v tabuľovej funkcií: typ pre záznam o produkte produkt_record, typ produkt_table pre tabuľu záznamov o produkte – tie použijeme na definíciu návratovej hodnoty tabuľkovej funkcie a jeden referenčný kurzor, ktorý použijeme na definíciu typu vstupných dát.

    CREATE OR REPLACE type produkt_record 
    IS OBJECT(
    skupina_id NUMBER,  
    produkt_nazov VARCHAR2(20)
    );
    /
    
    CREATE OR REPLACE type produkt_table 
    IS TABLE OF produkt_record;
    /
    
    -- referenčný kurzor musí byť súčaťou balíka, ak nemáme napr. balík 
    -- kde držíme konštanty, tak musíme vytvoriť separátny
    
    CREATE OR REPLACE PACKAGE refcur_pkg AS
      	type produkt_cur_type IS ref CURSOR;
    END refcur_pkg;
    /
    

    Napíšeme si logiku transformácie. V našom prípade ide o spracovanie reťazca a jeho rozloženie na viacero riadkov.

    CREATE OR REPLACE FUNCTION 
    parse_produkt(produkt_cur refcur_pkg.produkt_cur_type) 
    RETURN produkt_table 
    -- pokiaľ by sme vynechali kľúčové slovo PIPELINED dostali by sme
    -- štandartnú tabuľkovú funkciu 
    PIPELINED
    -- spracovanie môžeme parelelizovať klauzulou PARTITION BY stĺpec
    -- alebo BY ANY (optimalizátor určí spôsob paralelizácie sám)
    IS 
    c_string 	VARCHAR2(250);
    cnt 		BINARY_INTEGER;
    my_table 	DBMS_UTILITY.UNCL_ARRAY;
    v_skupina_id 	NUMBER;
    v_produkt 	VARCHAR2(255);
    
    BEGIN
    
      LOOP
    
        FETCH produkt_cur INTO v_skupina_id, v_produkt;
        EXIT   WHEN produkt_cur % NOTFOUND;
    
       -- použijeme štandartný package na parsovanie reťazca
      dbms_utility.comma_to_table(v_produkt,   cnt,   my_table);
    
      FOR i IN 1 .. my_table.COUNT
      LOOP
    
        IF my_table(i) IS NOT NULL THEN
         --  tento riadok vracia 1 záznam výsledkovej sady
          -- namiesto klasického RETURN použíjeme PIPE ROW()
          PIPE ROW(produkt_record(to_number(v_skupina_id),
     					my_table(i)));
    
        END IF;
    
      END LOOP;
    END LOOP;
    END parse_produkt;
    /
    

    A zlatý klinec programu je dotázanie sa na externý súbor a jeho on-the-fly normalizácia.

    SELECT *
    FROM TABLE(
     		parse_produkt(
     			CURSOR(
        				SELECT  *
       				FROM ext_table_csv
        			)
      		)
    );
    
    
    Vstup
    
    1,"Pracka,Chladnicka,Sporak,Zehlicka",
    2,"Radio,TV,DVD,Sluchatka",
    
    Výstup
    
    SKUPINA_ID         PRODUKT_NAZOV
    --------------------------------------------------------
    1                  Pracka
    1                  Chladnicka
    1                  Sporak
    1                  Zehlicka
    2                  Radio
    2                  TV
    2                  DVD
    2                  Sluchadla
    

    Tabuľkové funkcie a externé tabuľky je možné využívať od verzie Oracle Database 9i a preto veľa konzervatívnych programátorov ich nepozná alebo nepoužíva. Na uvedenom príklade vzhľadom na malý objem dát nebude vidieť časové zrýchlenie, ale už fakt, že môžete celú operáciu uskutočniť z SQL, bez volania externých programov, môže znamenať zjednodušenie postupu. V prípade spracovávania veľkého objemu dát je najpomalšou operáciou zápis a čítanie medzivýsledkov z diskov – práve tieto kroky použitie tabuľkových funkcií eliminuje pomocou zreťazenie krokov (pipelining) a umožňuje ukladať dáta rovno do cieľovej štruktúry alebo ich odovzdať ďalej.

    Dnešní ukázky můžete vyzkoušet na libovolné edici Oracle Database, včetně volně dostupné Express Edition. V případě potřeby si Oracle Database můžete stáhnout na webu společnosti Oracle.

    O autorovi
    Peter Hora pôsobí ako BI/DW Solutions Architect. Svoje štúdia absolvoval na Slovensku, v Izraeli, Holandsku a Českej Republike. Od ich ukončenia sa zaoberá problematikou business intelligence a datawarehousingu s primárnym zameraním na finančný sektor (dátová konsolidácia, New Basel Capital Accord , profitabilita ...)

    Související články:
    Tipy a triky pro Oracle XVI. – rychlejší aplikace i bez změn dotazů podruhé (03.02.2009)
    Tipy a triky pro Oracle XV. – rychlejší aplikace i bez změn dotazů poprvé (21.11.2008)
    Tipy a triky pro Oracle XIV. – datová komprese (21.10.2008)
    Tipy a triky pro Oracle XII. – Jak na řízení přístupu na úrovni záznamů? (15.04.2008)
    Tipy a triky pro Oracle XI. – Error Logging Tables (12.11.2007)
    Tipy a triky pro Oracle X. – bojujete s češtinou v Oracle podruhé? (14.05.2007)
    Tipy a triky pro Oracle IX. – bojujete s češtinou v Oracle? (06.02.2007)
    Tipy a triky pro Oracle VIII. – jak na přenosy velkých dat podruhé (03.01.2007)
    Tipy a triky pro Oracle VII. – jak na přenosy velkých dat poprvé (21.11.2006)
    Tipy a triky pro Oracle VI. – trochu jiné triggery (25.09.2006)
    Tipy a triky pro Oracle V. – změna dat v pohledu? (06.09.2006)
    Tipy a triky pro Oracle IV. – analytické funkce podruhé (14.08.2006)
    Tipy a triky pro Oracle III. – analytické funkce poprvé (19.07.2006)
    Tipy a triky pro Oracle II. – jak na hierarchické struktury? (07.06.2006)
    Tipy a triky pro Oracle I. – jak na automatické přidělování ID? (05.05.2006)

    ( Celý článek! | Autor: Peter Hora | Počet komentářů: 3 | Přidat komentář | Informační e-mailVytisknout článek )

    Vyhledávání
     

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

    Nic 
     (1446 hl.)
    Do 1 000,- Kč 
     (1005 hl.)
    Do 10 000,- Kč 
     (950 hl.)
    Do 25 000,- Kč 
     (1207 hl.)
    Do 50 000,- Kč 
     (957 hl.)
    Do 75 000,- Kč 
     (1108 hl.)
    Více než 75 000,- Kč 
     (948 hl.)

    Celkem hlasovalo: 7621


    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ář
    <<  Září  >>
    PoÚtStČtSoNe
        123
    45678910
    11121314151617
    18192021222324
    252627282930 

    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