CVIČENIE 11. Reporty
Téma cvičenia.
Tvorba zostáv a vytváranie dávok
V SQL*Plus sú k dispozícii príkazy pre nasledujúce činnosti:
· Úprava, uloženie, prečítanie a spustenie súborov s príkazmi jazyka SQL
· Prevádzanie činností, ktoré súvisia s vytváraním zostáv, ako sú:
o Sumarizácie
o Výpočty
o Vytváranie záhlaví, zápätí a titulov
o Formátovanie záhlaví stĺpcov
o Prerušenie stránok
o Tlač zostáv, alebo uloženie výsledkov do súboru
· V SQL*Plus je možné pracovať priamo s procedurálnym programovacím jazykom PL/SQL bez nutnosti kompilovať programy
· Práca s premennými
· Zobrazenie definície stĺpcov v tabuľkách, pohľadoch a synonymách v databáze
· Kopírovanie dát medzi databázami
Ak chceme vytvoriť zostavu v SQL*Plus, začneme tým, že napíšeme dotaz. Keď je vytvorený, môžete výstup začať formátovať pomocou príkazov SQL*Plus a vytvoriť nadpis, záhlavia stĺpcov atď.
SET LINESIZE n
Nastavenie počtu riadkov na stranu a počet znakov
na riadok.
…
štandard A4 na výšku
SQL>SET
PAGESIZE 60
SQL>SET
LINESIZE 123
Príklad:
… štandard A4 na šírku
SQL>SET
PAGESIZE 25
SQL>SET
LINESIZE 80
Pomocou príkazu COLUMN je možné zmeniť záhlavie
stĺpca a niektoré vlastnosti formátovania.
Pokiaľ text záhlavia obsahuje medzery je nutné ho uzavrieť do dvojitých úvodzoviek (""). Ak má byť zobrazené na dvoch riadkoch, použite ako oddeľovač zvislú čiaru (|).
|
Dátový typ |
Formát |
Výsledok |
|
Number |
999,999.00 |
4,550.00 |
|
Number |
000,000.00 |
004,550.00 |
|
Number |
$9,000.00 |
$4,550.00 |
|
Character |
A10 |
Abcdefghij |
|
Character |
A20 |
Abcdefghijklmnoprstu |
Pri znakových stĺpcoch sa formát zadáva v tvare ![]()
Príklad:
SQL>
COLUMN meno FORMAT A5 WORD_WRAP
SQL>
SELECT ou_meno meno FROM os_udaje;
MENO
-----
Karol
ina
Marek
Tomas
Jana
MENO
-----
Emil
Zuzan
a
Stani
slav
MENO
-----
Celin
e
Príklad:
SQL>
COLUMN meno HEADING "Meno študenta" FORMAT A20
SQL>
SELECT ou_meno meno FROM os_udaje;
Meno študenta
--------------------
Karolina
Marek
Tomas
Jana
Emil
Zuzana
Stanislav
Celine
Príklad:
SQL> COLUMN meno
HEADING "Meno|študenta" FORMAT A10
SQL> SELECT ou_meno
meno FROM os_udaje;
MENO
STUDENTA
----------
Karolina
Marek
Tomas
Jana
Emil
Zuzana
Stanislav
Celine
Pre formáty čísel použite vzor z číslic 0 a 9. Pri formáte 990.00 napríklad bude u všetkých čísel vytlačená číslica pre jednotky.
Príklad:
SQL> column priemer format 90.00
SQL> select zp_st_os_cislo, avg(zp_vysledok ) priemer from zap_predmety
2* group by
zp_st_os_cislo;
ZP_ST_OS_CISLO PRIEMER
-------------- -------
1001 2.00
1002 1.00
1003 2.00
1004 2.00
1005 1.00
1006 2.00
1007 2.50
Pri stĺpcoch typu DATE nie je možné formát definovať príkazom COLUMN. Môžete však týmto príkazom definovať šírku stĺpca na zostave, aby zodpovedala formátu použitému pre zobrazenie stĺpca.
Formát stĺpca typu DATE je treba určiť pomocou funkcie TO_CHAR v príkaze SELECT. Často používané formátovacie znaky pre dátumy sú v nasledujúcej tabuľke. Formáty RR a RRRR sú v Oracle8 nové. Pracujú podobne ako formáty YY a YYYY, ale inak doplňujú storočie pre neúplne zadaný rok.
|
Skratka |
Význam |
|
DD |
Deň v mesiaci (01 až 31) |
|
Day |
Deň v týždni, prvé písmeno je veľké (napr. Saturday) |
|
MM |
Mesiac (01 až 12) |
|
Month |
Názov mesiaca, prvé písmeno je veľké |
|
MON |
Prvé tri písmena z názvu mesiaca veľkými písmenami |
|
YY |
Rok (00 až 99) |
|
YYYY |
Rok (vrátane storočia, napr. 1999, alebo 1901) |
|
RR |
Rok (00 až 99) |
|
RRRR |
Rok (vrátane storočí, napr. 1999, alebo 2001) |
|
MI |
Minúta (00 až 60) |
|
HH |
Hodina (01 až 12) |
|
HH24 |
Hodina (00 až 23) |
|
SS |
Sekunda (00 až 59) |
Všimnite si malého, ale zásadného rozdielu medzi MM
- mesiac a MI - minúta.
Použité premenné
d: premenná typu DATE
x: reťazec udávajúci formát dátumu (pozri predošlú
tabuľku). Nemusí byť uvedený. nls_parm: udáva jazyk, v ktorom sa majú vrátiť
názvy mesiacov, dní a rokov. Parameter nemusí byť uvedený. Ako implicitná
hodnota sa použije implicitný jazyk pre dáta. Parameter sa udáva v tvare
'NLS_DATE_LANGUAGE = language'
Príklad:
1* SELECT
TO_CHAR(SYSDATE,'DD.MM.RRRR') FROM DUAL
SQL> /
TO_CHAR(SY
----------
03.02.2003
Formát stanovený príkazom COLUMN má význam po celú dobu, čo ste v nástroji SQL* Plus.
S hlavičkou vyzerá výstup dotazu ako skutočná
zostava. Existujú dve verzie príkazu TTITLE. Pomocou prvej z nich je možné na
začiatok zostavy vypísať riadok textu:
TTITLE [printspec
[text|variable] ...] |[OFF|ON]
Použité premenné
printspec: klauzula udávajúca, kam sa má umiestniť a ako má SQL*Plus formátovať hlavičku.
Môže to byť:
· COL n
· SKIP [n]
· TAB n
· LEFT
· CENTER
· RIGHT
· BOLD
· FORMAT text
text: text záhlavia variable: jedna z nasledovných premenných SQL*Plus:
· SQL.LNO - číslo riadku
· SQL.PNO - číslo stránky
· SQL.RELASE - verzia jadra Oracle
· SQL.SQLCODE - číslo poslednej chyby
· SQL.USER - prihlásený užívateľ
OFF|ON - vypnutie a znovu zapnutie vypisovania nadpisu
Druhá možnosť tohto príkazu umožňuje zložitejšie
formátovanie. Môžete formátovať časť záhlavia vľavo, vpravo a uprostred a
môžete do záhlavia umiestniť a stĺpce použité v dotaze. Táto varianta sa často
používa v zostavách, ktoré sú utriedené a agregované podľa jednotlivých
kategórií.
SQL> TTITLE CENTER
'Zoznam studentov' RIGHT SQL.PNO
SQL> SELECT ou_meno
meno, ou_priezvisko priezvisko FROM os_udaje;
Zoznam studentov 1
MENO
STUDENTA PRIEZVISKO
---------- ---------------
Karolina Velka
Marek Sartoris
Tomas Chrenka
Jana Ulicna
Emil Bobok
Zuzana Bebjakova
Zoznam studentov 2
MENO PRIEZVISKO
---------- ---------------
Stanislav Vnuk
Celine Dion
SQL> TTITLE OFF
SQL> /
MENO PRIEZVISKO
---------- ---------------
Karolina Velka
Marek Sartoris
Tomas Chrenka
Jana Ulicna
Emil Bobok
Zuzana Bebjakova
Stanislav Vnuk
MENO PRIEZVISKO
---------- ---------------
Celine Dion
SQL> TTITLE ON
SQL> /
... opätovné zapnutie nadpisu, výsledok je rovnaký ako prvý
prípad
Ak chcete do záhlavia zostavy vložiť aktuálny dátum, musíte previesť nasledujúce kroky:
· Pridajte do dotazu pseudo-stĺpec SYSDATE a priraďte mu alias.
· Definujte pre tento alias príkaz COLUMN
·
Definujte príkaz TTITLE, ktorý bude obsahovať alias.
SQL>TTITLE LEFT datum
CENTER 'Zoznam studentov'
SQL>COLUMN datum
NEW_VALUE datum NOPRINT
SQL>SELECT
TO_CHAR(SYSDATE,'DD.MM.RRRR') datum, st_os_cislo Cislo, ou_meno, ou_priezvisko
2 FROM student, os_udaje
3 WHERE st_ou_rod_cislo = ou_rod_cislo;
03.02.2003 Zoznam studentov
CISLO OU_MENO
OU_PRIEZVISKO
---------- ---------------
---------------
1001 Karolina
Velka
1002 Marek
Sartoris
1003 Tomas
Chrenka
1004 Jana
Ulicna
1005 Emil Bobok
1006 Zuzana
Bebjakova
1007 Stanislav
Vnuk
1008 Celine
Dion
Pomocou príkazu BTITLE je možné definovať pätu stránky zostavy. Má rovnakú syntax ako príkaz TTITLE
Príklad:
SQL>TTITLE CENTER
'Zoznam studentov'
SQL>btitle center SQL.PNO
SQL>SELECT os_cislo
Cislo, meno, ou_priezvisko
2 FROM student, os_udaje
3 WHERE st_ou_rod_cislo = ou_rod_cislo;
Zoznam studentov
CISLO OU_MENO
OU_PRIEZVISKO
---------- ---------------
---------------
1001 Karolina
Velka
1002 Marek
Sartoris
1003 Tomas
Chrenka
1004 Jana
Ulicna
1005 Emil
Bobok
1006 Zuzana
Bebjakova
1007 Stanislav
Vnuk
1008 Celine
Dion
1
SQL*Plus ponúka možnosť sumarizácie skupín
záznamov v zostave. Pre vytvorenie zostavy, ktorá obsahuje detaily, prerušenia
a sumarizácie, je možné využiť príkazy BREAK a COMPUTE.
Príkazom určíte body prerušenia v zostave. Pokiaľ
bude stĺpec uvedený v príkaze BREAK obsahovať inú hodnotu ako v predchádzajúcom
zázname, prevedie SQL*Plus vami požadovanú akciu (napr. prechod na novú
stranu). Vytlačí taktiež sumarizačné informácie o tejto skupine. Tieto informácie
sa definujú pomocou príkazu COMPUTE. Jeho syntax je nasledovná:
funkcia: jedna z nasledujúcich funkcií: AVG,
COU[NT], MAX[IMUM], MIN[IMUM], NUM[BER], STD, SUM, VAR[IANCE] text: text pre
vypočítanú hodnotu výraz: funkcia, ktorá sa má pre výpočet použiť stĺpec:
stĺpce, ktoré sa používajú pri výpočte alias: aliasy pre stĺpce, ktoré sa
používajú pri výpočte
SQL> break on report
SQL> compute avg label 'Celkovy priemer ' of zp_vysledok on report
SQL>Select zp_st_os_cislo , zp_vysledok from zap_predmety
2* order by 1;
ZP_ST_OS_CISLO ZP_VYSLEDOK
-------------- -----------
1001 3
1001 1
1002 1
1002 1
1003 2
1004 3
1004 2
1004 1
1005
1005 1
1006 2
ZP_ST_OS_CISLO ZP_VYSLEDOK
-------------- -----------
1007 3
1007 2
-----------
Celkovy prieme 1.83333333
Príklad:
SQL>BREAK ON
zp_st_os_cislo SKIP 2
SQL>COMPUTE avg LABEL
'Priemer ' OF zp_vysledok ON zp_st_os_cislo
SQL>Select zp_st_os_cislo , zp_vysledok from zap_predmety
2* order by 1;
ZP_ST_OS_CISLO ZP_VYSLEDOK
-------------- -----------
1001 3
1
************** -----------
Priemer 2
1002 1
1
************** -----------
Priemer 1
ZP_ST_OS_CISLO ZP_VYSLEDOK
-------------- -----------
1003 2
************** -----------
Priemer 2
1004 3
2
1
************** -----------
Priemer 2
ZP_ST_OS_CISLO ZP_VYSLEDOK
-------------- -----------
1005
1
************** -----------
Priemer 1
1006 2
************** -----------
Priemer 2
ZP_ST_OS_CISLO ZP_VYSLEDOK
-------------- -----------
1007 3
2
************** -----------
Priemer 2.5
Nezabudnite na možnosť odložiť si výstupnú
zostavu do súboru pomocou príkazu SPOOL.
Ak neuvediete príponu, pridá ju SQL*Plus automaticky (zvyčajne .lis, alebo .lst). Po vykonaní príkazu SPOOL začne SQL*Plus posielať všetky výstupy aj do súboru, až po vykonanie príkazu SPOOL OFF, alebo po ukončenie SQL*Plus.
Keď vytvárame zostavu, obvykle nechcete, aby
obsahovala dodatočné informácie. Tieto informácie môžete v SQL*Plus potlačiť
pomocou nasledujúcich príkazov:
Potlačí zobrazenie príkazu SQL
pred jeho prevedením. Pokiaľ chcete príkaz pred prevedením zobraziť, zadajte
RECSEP je skratka pre "record separator" - oddeľovač záznamov. Nastavenie tohto prametra hovorí SQL*Plus, čo má robiť medzi dvoma záznamami v zostave. Parameter RECSEPCHAR udáva znak, ktorý SQL*Plus opakovane tlačí na riadok medzi dva záznamy v zostave.
Počiatočné nastavenie pre RECSEP je WRAP a
prázdny znak pre RECSEPCHAR. Pri tomto nastavení sa medzi záznamy
tlačí prázdny riadok, ale len vtedy, keď aspoň v jednom stĺpci prvého z nich
došlo k zalomeniu textu do ďalšieho riadku.
UNDERLINE slúži na podčiarknutie hlavičky. Implicitne je tento parameter nastavený na ‘-‘. Je možné ho nastaviť na zapnuté, alebo vypnuté.
SET RECSEP
{WR[APPED]|EA[ACH]|OFF}
SET RECSEPCHAR {''|znak}
SET COLSEP {''|znak}
SET und[erline] {''|znak| ON | OFF}
Príklad:
SQL> set linesize 31
SQL> set recsep each
SQL> set colsep |
SQL> set underline *
SQL> select ou_meno
Meno, ou_priezvisko Priezvisko from os_udaje;
MENO |PRIEZVISKO
***************|***************
Karolina |Velka
_______________________________
Marek |Sartoris
_______________________________
Tomas |Chrenka
_______________________________
Jana |Ulicna
_______________________________
Emil |Bobok
_______________________________
Zuzana |Bebjakova
_______________________________
Stanislav |Vnuk
_______________________________
Celine |Dion
_______________________________
8 rows selected.
Vďaka premenným môžete vytvárať rýchlo sa prispôsobiteľné dotazy. Ukážeme si ako definovať premenné a ako do SQL*Plus predávať parametre.
Premenné sa používajú, aby ste mohli pomocou jedného dotazu získať rôzne výstupy. Premennú môžete v dotaze umiestniť všade, kde môžete napísať stĺpec, alebo výraz. Ak potrebujete z dotazu získať záznamy pre rôzne zadania, umiestnite premennú do klauzule WHERE.
Premenné sa definujú príkazom DEFINE:
Ďalej je možné premenné definovať aj jednoduchým odkazom na ňu (pred menom premennej sa uvedie znak '&' v dotaze)
Ak SQL*Plus narazí na premennú, ktorej dosiaľ
nebola priradená hodnota, vyzve vás, aby ste ju zadali.
Ak sa v dotaze potrebujete na rovnakú premennú
odkázať viac ako raz, napíšte namiesto jedného znaku '&' dva (&&).
Tým poviete SQL*Plus, aby vás vyzval k zadaniu hodnoty premennej len raz, a
potom už používal vami zadané hodnoty. Pri vykonaní nasledujúceho dotazu budete
napríklad k zadaniu hodnoty premennej .... vyzvaný len raz:
SQL> select ou_meno, ou_priezvisko
2 from os_udaje
3 where ou_meno LIKE '&meno';
Enter value for meno: K%
old 3: where ou_meno LIKE '&meno'
new 3: where ou_meno LIKE 'K%'
OU_MENO OU_PRIEZVISKO
------------------------------
Karolina Velka
Príklad:
SQL> define priezvisko = 'B%'
SQL> select ou_meno, ou_priezvisko
2 from os_udaje
3 where ou_priezvisko LIKE '&priezvisko';
old 3: where ou_priezvisko LIKE
'&priezvisko'
new 3: where ou_priezvisko LIKE 'B%'
OU_MENO OU_PRIEZVISKO
------------------------------
Emil Bobok
Zuzana Bebjakova
SQL> define priezvisko = 'V%'
SQL> /
old 3: where ou_priezvisko LIKE
'&priezvisko'
new 3: where ou_priezvisko LIKE 'V%'
OU_MENO OU_PRIEZVISKO
------------------------------
Karolina Velka
Stanislav Vnuk
Príklad:
SQL> select ou_meno, ou_priezvisko
2 from os_udaje
3 where ou_meno LIKE '&prem'
4 OR ou_priezvisko LIKE
'&prem';
Enter value for prem: S%
old 3: where ou_meno LIKE '&prem'
new 3: where ou_meno LIKE 'S%'
Enter value for prem: S%
old 4: OR ou_priezvisko LIKE '&prem'
new 4: OR ou_priezvisko LIKE 'S%'
OU_MENO OU_PRIEZVISKO
------------------------------
Marek Sartoris
Stanislav Vnuk
Príklad:
SQL> select ou_meno, ou_priezvisko
2 from os_udaje
3 where ou_meno LIKE '&&prem'
4 OR ou_priezvisko like '&&prem';
Enter value for prem: S%
old 3: where ou_meno LIKE '&&prem'
new 3: where ou_meno LIKE 'S%'
old 5:
like '&&prem'
new 5:
like 'S%'
OU_MENO OU_PRIEZVISKO
------------------------------
Marek Sartoris
Stanislav Vnuk
Dotaz uložený v súbore môžeme spustiť z príkazového riadku pomocou parametra @ meno_suboru alebo pomocou príkazu SQL*Plus START meno_suboru. Z operačného systému je možné spustiť script nasledovne:
sqlplus user/password @meno_suboru
Príklad:
Majme v súbore
najdi.sql uložený SQL príkaz z predchádzajúceho príkadu' a za dotaz bol
napísaný príkaz pre jeho spustenie - znak ';', alebo '/'. Teda jeho obsah je:
select
ou_meno, ou_priezvisko
from
os_udaje
where
ou_meno LIKE '&&prem'
OR ou_priezvisko like '&&prem';
Potom príkaz na jeho spustenie z operačného
systému je nasledujúci:
SQL*Plus: Release 8.1.7.0.0
- Production on Fri Feb 7 14:07:58 2003
(c) Copyright 2000 Oracle
Corporation. All rights reserved.
Enter password:
Connected to:
Oracle8i Enterprise
Edition Release 8.1.7.0.1 - Production
With the Partitioning
option
JServer Release 8.1.7.0.1
- Production
Input truncated to 31
characters
Enter value for prem: S%
old 3: where ou_meno LIKE '&&prem'
new 3: where ou_meno LIKE 'S%'
old 4: OR ou_priezvisko LIKE '&&prem'
new 4: OR ou_priezvisko LIKE 'S%'
OU_MENO OU_PRIEZVISKO
---------------
---------------
Marek Sartoris
Stanislav Vnuk
Operačný systém teda zavedie SQL*Plus, ktorý spustí zadaný skript. SQL*Plus a vyzve vás k zadaniu hodnoty pre premennú prem.
Z príkazového riadku operačného systému môžete zavolať SQL*Plus a spustiť dotaz (alebo iný príkaz SQL) a môžete mu taktiež pomocou parametrov predať hodnoty. Hodnoty zadané na príkazovom riadku sú v SQL*Plus dostupné pomocou preddefinovanej sady parametrov označených číslicami, ktoré zodpovedajú poradiu parametrov na príkazovom riadku.
Máme rovnaký dotaz ako v predchádzajúcom príklade, ale meno premennej zmeníme na &1:
Príklad:
Majme ten istý SQL príkaz
v súbore najdi.sql, len namiesto pomenovania premennej, pomenujeme ju
číslom 1. Teda obsah tohto súboru je:
select
ou_meno, ou_priezvisko
from
os_udaje
where
ou_meno LIKE '&&1'
OR ou_priezvisko like '&&1';
Potom príkaz na jeho spustenie z operačného
systému so zadaním hodnoty parametra je nasledujúci:
SQL*Plus: Release
8.1.7.0.0 - Production on Fri Feb 7 14:20:17 2003
(c) Copyright 2000 Oracle
Corporation. All rights reserved.
Enter password:
Connected to:
Oracle8i Enterprise
Edition Release 8.1.7.0.1 - Production
With the Partitioning
option
JServer Release 8.1.7.0.1
- Production
Input truncated to 28
characters
old 3: where ou_meno LIKE '&&1'
new 3: where ou_meno LIKE 'S%'
old 4: OR ou_priezvisko LIKE '&&1'
new 4: OR ou_priezvisko LIKE 'S%'
OU_MENO OU_PRIEZVISKO
---------------
---------------
Marek Sartoris
Stanislav Vnuk
Operačný systém zavolá SQL*Plus spustí skript, vezme reťazec S% a nahradí ním v dotaze premennú &&1.