Dotazy

  • Ukazkovy projekt Knihkupectvi
    - tabulky Authors, Books - tabulka Works (propojeni mezi knihami a autory)
    - tabulka Inventory (pocet knih na sklade, cena, minimalni mnozstvi pred znovuobjednanim)
    - tabulka Orders (knihy, ktere je treba doobjednat z velkoobchodu)
    - tabulka Best (automaticky udrzovana tabulka obsahujici aktualni zebrizek nejlepsich prodeju knih)

    SQL dotazy:
    - Knihy, ktere napsali autori do 50 let a ktere vydelaly vic jak 3000;
    - Autor, jehoz kniha vydelala nejvic;
    - Autor, jehoz knihy vydelaly celkove nejvic;
    - Autori a jejich celkove vydelky;
    - Kniha, ktera vydelala druha nejvic;
    - Knihy, ktere nemaji prirazeneho ani jednoho autora.

    Kursory:
    - kontrola objednavek v tabulce Orders, pokud je objednavka starsi jak 1 mesic, preobjedna se;
    - z tabulky Books vybere prvni tri knihy, ktere vydelaly v dosavadni historii knihkupectvi nejvic.

    Triggery:
    - Kontrola, zda se neprodava vic knih, nez je na sklade;
    - Smazani objednavky z Orders, pokud jiz pocet knih na sklade v Inventory dosahl pozadavaneho mnozstvi;
    - Vytvoreni nove objednavky v Orders, pokud je v Inventory mene knih, nez stanoveny limit.

  • Mozna temata projektu
    - Knihovna + vedeni vypujcek
    - Armadni sklad + kontrola stavu zbrani
    - Kartoteka vezenskeho zarizeni + kontrola pristupu
    - Kartoteka katastralniho uradu
    - Databaze Jihomoravskych plynarem + odbery plynu jednotlivych koncovek + vyuctovani
    - Databaze transfuziologicke stanice + obednavky na odber, evidence odebrane plasmy a krve
    - Internetovy obchod
    - ...

  • Lze vlozit do tabulky naraz vice radku pomoci prikazu INSERT?
    Lze, ale pouze pokud je mozne formulovat vkladana radky pomoci prikazu SELECT, ktery vrati vice zaznamu.
    Prikaz INSERT INTO ucitele (SELECT id, jmeno FROM lide); vlozi do tabulky 'ucitele' vsechny osoby, kteri jsou ulozeni v tabulce 'lide'.
    Pro opakovane volani prikazu INSERT lze take pouzit cyklus LOOP jazyka PL/SQL. Pro interaktivni dotaz uzivatele na hodnotu lze pouzit prikaz INSERT INTO ucitele(id, jmeno) VALUES (&identifikace, '&jmeno_ucitele');

  • Lze ukoncit predcasne provadeni triggeru?
    Trigger lze ukoncit predcasne pomoci podminky a poziti prikazu RETURN;
    Napriklad ... IF nesplnena_podminka THEN RETURN; END IF;

  • Jak nastavit sloupec tabulky tak, aby se automaticky vzestupně čísloval (auto increment)?
    Databáze Oracle oproti jiným databázovým strojům neumožňuje přímo definovat sloupec jako automaticky generovanou vzestupnou sekvenci. Je nutno využít ručně vytvářených sekvencí [CREATE SEQUENCE jmeno_sekvence START WITH 1 INCREMENT BY 1] a tuto sekvenci využít pro naplnení príslužného pole. Popis dvou možných prístupu (s využitím triggeru a bez nej) naleznete na http://jen.fluxcapacitor.net/geek/autoincr.html

  • Lze se pripojit k databázi Oracle "zvencí"?
    Ano, na stroji db.fi.muni.cz na portu 1521 beží SQL*Net na který se dá pripojit libovolným programem, ktery komunikaci pres SQL*Net umí. SID databáze je db10. Na fakultním firewallu prístup povolen není, takže to funguje jen z FI; napr. z kolejí už ne.

  • Jak vypížu seznam svých vytvorených tabulek?
  • SELECT table_name FROM user_tables;
  • Jak vyvolám historii príkazu v SQLPLUS?
  • SQLPLUS pod unixovými stroji bohužel neumožnuje pracovat s historii prikazu. Proto je vhodnejží použivat skriptový soubor a spoužtet jej pomocí @jmeno_skriptu (viz cvicení 1). Existuje alternativní nastroj se stejným vzhledem a pridanou podporou historie GQLPLUS, který je dostupny na pocitacich nymfeXX a aise.
    Prihlaseni pro pocitace nymfe:
    nymfe17: module add gqlplus
    nymfe17: gqlplus login@db10
    
    Prihlaseni pro aisu:
    aisa: module add gqlplus-1.8
    aisa: gqlplus login@db10
    

  • Jak kaskádně odstranit z databáze záznamy svázáné integritním omezením?
  • Provede se pomocí přidání klauzule ON DELETE CASCADE u definice integritního omezení. Následující příklad zajistí, že kdykoli je provedeno odstranění řádku z tabulky a, provede se zároveň odstranění vžech řádku z tabulky b, které obsahují danou referencovanou hodnotu (sloupec apk) z tabulky a.
    	CREATE TABLE a (pk NUMBER PRIMARY KEY);
    	CREATE TABLE b (jmeno VARCHAR2(10), apk CONSTRAINT fk_apk REFERENCES a(pk) ON DELETE CASCADE);
    
    	INSERT INTO a VALUES (1);
    	INSERT INTO a VALUES (2);
    	INSERT INTO b VALUES ('tom', 1);
    	INSERT INTO b VALUES ('pepa', 2);
    
    	SELECT * FROM b;
    	DELETE FROM a WHERE pk = 1;
    	SELECT * from b;
    	
    Je vžak nutné dobře zvážit zamýžlené chování, aby nedožlo k nechtěnému smazání dat. Někteří databázový programátoři tuto konstrukci z tohoto důvodu nepoužívají.
  • Jak zobrazit na výstup pouze řádky od X-tého výže?
  • Každý řádek tabulky nebo výsledku příkazu select má přiřazenu hodnotu pseudo-sloupce rownum počínaje číslem 1. Prvních deset záznamů tabulky tak zobrazíme pomocí příkazu:
    SELECT * FROM tabulka WHERE rownum < 11;
    Číslo řádku vžak není fixní hodnota a průběžně se mění v závislosti na průběhu vyhodnocení dotazu, tak aby první řádek na výstupu měl vždy číslo 1. Pro zobrazení řádků tabulky od desátého výže (dle pozice v původní tabulce) musíme použít odližnou konstrukci využívající vnořený dotaz, během kterého si do proměnné prom_r uložíme původní očíslování řádků:
    SELECT column_name FROM (SELECT column_name, rownum prom_r FROM tabulka) WHERE prom_r > 10;
    Bližží informace lze nalézt na http://www.adp-gmbh.ch/ora/sql/rownum.html
  • Lze přímo v definici tabulky zajistit převedení vkládaného řetězce na velké znaky?
  • Není. Je nutné využít trigger vázaný na událost BEFORE INSERT. Podrobněji viz.: http://www.psoug.org/reference/table_trigger.html.
  • Chování dvou a více seq.NEXTVAL v rámci jednoho příkazu INSERT.
  • Pokud v rámci jednoho příkazu INSERT INTO použijeme dvě a více volání metody NEXTVAL pro zisk následující hodnoty sekvence, vžechna tato volání vrátí stejnou hodnotu bez ohledu na pořadí.
    Tedy pokud máme sekvenci seq s aktuální hodnotou 5 a inkrementem o 1, příkaz INSERT INTO tabulka VALUES (seq.NEXTVAL, 'pokus', seq.NEXTVAL); vloží hodnoty (6, 'pokus', 6).
  • Definice vyhledavaneho vzoru pro prikaz LIKE obsahujici '_' nebo '%'.
  • Pokud chci definovat vyhledavaci vzor pro prikaz LIKE, ktery ma obsahovat zastupny znak '_' resp. '%' a zaroven i tento znak v jeho puvodnim vyznamu, je nutne pouzit dodatecneho prikazu ESCAPE. Pro vyber vsech radku, jejichz sloupec stroj je ve tvaru 'stroj_nymfedvojcifernecislo' (napr. stroj_nymfe17) pouzijeme nasledujici syntaxi:
    SELECT * FROM tab WHERE stroj LIKE 'stroj\_nymfe__' ESCAPE '\';
    Znak '\' funguje jako specialni priznak, ze bezprostredne nasledujici znak nema byt interpretovan v jeho specialnim vyznamu, ale jako bezny znak.
  • Razeni vysledku podle vice sloupcu
  • Pro serazeni radku dle zadaneho sloupce lze vyuzit klausuli ORDER BY jmeno_sloupce. Pokud chceme radit podle vice sloupcu zadame jejich jmena a oddelime carkami, tedy: SELECT * FROM tabulka ORDER BY sloupec_1 ASC, sloupec_2 DESC, ... U kazdeho sloupce lze zadat, jakym zpusobem se ma radit. Nejprve se vysledek radi podle prvniho parametru, vysledek dle druhe atd.
  • Funkce vracejici tabulku
  • Navod na vytvoreni funkce vracejici vice radku (tabulku) najdete zde.
  • Zruseni specialniho vyznamu znaku & v sqlplus
  • Klient sqlplus/gqlplus chape znak & (ampersant) jako znak uvozujici jmeno promenne. Napr.: select 'foo & bar' from dual; bude vyhodnocen jako prikaz s promennou bar, jejiz hodnotu bude muset uzivatel zadat. Pokud chceme takove chovani zrusit mame dve moznosti:
    1. set define off;
    2. set escape "\";

    Ad 1/: pripadne prikazy obsahujici & nemusi byt modifikovany:
    select 'foo & bar' from dual;
    Znovu zapnuti specialniho vyznamu se provede prikazem: set define on;
    Ad 2/: pred & musime pouzit zvoleny escape znak: select 'foo \& bar' from dual;


  • Nastavení kláves v gqlplus
  • Pokud máte potíže s fungováním některých kláves pro editaci na příkazovém řádku programu gqlplus, musíte si nastavit správně obsah souboru ".inputrc". Tento soubor je uložený ve vaąem domovském adresáři. Nápověda je k dispozici v sekci "READLINE" manuálových stránek shellu, např. "man bash".
    Já mám nastaveno:
    "\e[H": beginning-of-line
    "\e[F": end-of-line
    "\e[3~": delete-char
    "\e[C": forward-char
    "\e[D": backward-char
    "\e[A": previous-history
    "\e[B": next-history
    		
    V zásadě se jedná o přepis sekvence znaků generovaných při stisku klávesy na symbolické jméno, které odpovídá požadovanému chování. Pro vlastní definice některých kláves můžete využít pro získání sekvence znaků následujícího triku: v shellu stiskněte Ctrl+v a požadovanou klávesu - na terminálu se zobrazí sekvence znaků. Např. pro ąipku doprava dostanene:
    ^[[D
    Znaky "^[" znamenají escape sekvenci, která je v inputrc vyjádřena pomocí \e.


  • Nastavení českého prostředí
  • Při spuątění sqlplus na aise budete mít zřejmě nastaveno POSIX (americké) jazykové prostředí. Pro nastavení jazyka a kódování lze použít: NLS_LANG='CZECH_CZECH REPUBLIC.EE8ISO8859P2' sqlplus xdohnal@db10
    Pro kódování českých windows: NLS_LANG='CZECH_CZECH REPUBLIC.EE8MSWIN1250' gqlplus xdohnal@db10
    Více zde.


  • Systémový katalog Oracle
  • Dostupné pohledy a tabulky systémového katalogu Oracle jsou v tabulce dictionary. Viz SELECT * FROM dictionary;
    Více zde.