8. blok
Balíky Systémové balíky. Balíky.
Studijní cíl Tento blok je věnován vytváření uživatelských balíků funkcí v jazyce PL/SQL a použití systémových balíků.
Doba nutná k nastudování
2 - 3 hodiny
Průvodce studiem Při studiu tohoto bloku se předpokládá, že čtenář je obeznámen s vytvářením a použitím procedur a funkcí v jazyce PL/SQL.
1. Balíky Balíky jsou konstrukcí v PL/SQL,, která umožňuje ukládat spolu související objekty. Balíky mají 2 samostatné části - specifikaci a tělo. Každá z těchto částí se ukládá do datového slovníku samostatně. Balíky také zjednodušují závislosti mezi databázovými objekty. Ve specifikaci jsou deklarovány typy, proměnné, konstanty, výjimky, kurzory a podprogramy pro použití. Specifikace balíku obsahuje informaci o obsahu balíku, ale neobsahuje žádný kód podprogramů. Tělo úplně definuje kurzory a subprogramy – implementační detaily a privátní deklarace, které jsou neviditelné z aplikace. Je možné změnit tělo balíčku balíčku bez změny specifikace a tím vlastně neovlivnit vazbu na další aplikace. Programy volající balík nemusí být rekompilovány při změně těla balíčku (tzv. balíčky přerušují řetězec závislostí). Syntaxe specifikace i těla balíku je ukázána na obr. 1 a 2. Adresace jednotlivých částí balíku: balíku [<schéma>.]
.< ma>.]. [<schéma>.].< ma>.]. [<schéma>.].< ma>.]. [<schéma>.].< ma>.]. David Žák IDAS2/8 – Balíky. Systémové balíky.
1
Obr. 1. Syntaxe zápisu specifikace balíku Zdroj: Oracle.
Obr. 2. Syntaxe zápisu těla balíku Zdroj: Oracle.
David Žák IDAS2/8 – Balíky. Systémové balíky.
2
Balíky mohou mít kromě veřejných částí také části privátní, ať už jde o procedury, funkce či proměnné. Privátní části balíku jsou přístupné pouze pro podprogramy v balíku a nemohou být volány externími programy, jak ukazuje následující obrázek.
Výhody balíků • •
• • •
• •
Zvětšují obor názvů – může být použit stejný název procedury v různých balících V jednom balíku může být mnoho procedur, ale v datovém slovníku bude existovat pouze jeden objekt – balík, namísto jednoho objektu datového slovníku pro každou proceduru nebo funkci v případě nevyužití balíků Podporují zapouzdření, části kódu (podřízené rutiny), které nemají využití mimo balíček, jsou ukryty v balíku a mimo něj nejsou viditelné Podporují proměnné uchovávané po celou dobu relace - můžete mít proměnné, které si udrží své hodnoty mezi jednotlivými voláními v databázi Podporují spouštěcí kód – tj. úsek kódu, který se provede při prvním odkazu na balík v relaci, tj. umožňuje automatické provedení složitého inicializačního kódu Umožňují seskupení souvisejících funkcí Přerušují řetězec závislostí - v běžném případě při změně definice databázového objektu se zneplatní všechny databázové objekty na něm i nepřímo závislé, k jejich rekompilaci dochází poté při jejich prvním dalším použití. V případě použití balíků je zneplatněno v takovém případě pouze tělo balíku, které je na redefinovaném objektu závislé. Objekty, které jsou na daném balíku závislé, však závisí na specifikaci balíku a nikoli na jeho těle. Proto tyto objekty zůstávají nadále platné a vlastní balíky přeruší řetězec závislostí.
David Žák IDAS2/8 – Balíky. Systémové balíky.
3
Příklad balíku (zdroj Oracle): CREATE OR REPLACE PACKAGE emp_actions AS -- package specification PROCEDURE hire_employee (employee_id (employee NUMBER, last_name VARCHAR2, first_name VARCHAR2, email VARCHAR2, phone_number VARCHAR2, hire_date DATE, job_id VARCHAR2, salary NUMBER, commission_pct NUMBER, manager_id NUMBER, department_id NUMBER); PROCEDURE fire_employee (emp_id NUMBER); FUNCTION num_above_salary _salary (emp_id NUMBER) RETURN NUMBER; END emp_actions;
CREATE OR REPLACE PACKAGE BODY emp_actions AS -- package body -- code for procedure hire_employee PROCEDURE hire_employee (employee_id (employee NUMBER, last_name VARCHAR2, first_name VARCHAR2, email VARCHAR2, phone_number VARCHAR2, hire_date DATE, job_id VARCHAR2, salary NUMBER, commission_pct NUMBER, manager_id NUMBER, department_id NUMBER); IS BEGIN INSERT INTO employees VALUES (employee_id, last_name, first_name, email, phone_number, ber, hire_date, job_id, salary, commission_pct, ommission_pct, manager_id, department_id); END hire_employee; -- code for procedure fire_employee PROCEDURE fire_employee (emp_id NUMBER) IS BEGIN DELETE FROM employees WHERE employee_id employee_i = emp_id; END fire_employee; -- code for function num_above salary FUNCTION num_above_salary (emp_id NUMBER) RETURN NUMBER IS emp_sal NUMBER(8,2); num_count NUMBER; BEGIN SELECT salary INTO emp_sal FROM employees WHERE employee_id = emp_id; SELECT COUNT(*) INTO num_count FROM employees WHERE salary > emp_sal; RETURN num_count; END num_above_salary; END emp_actions; David Žák IDAS2/8 – Balíky. Systémové balíky.
4
2. Systémové balíky Vestavěné, někdy také nazývané jako systémové balíky, nabízí různé možnosti při řešení problémů. Některé balíky jsou napsány v jazyku C, jsou tedy rychlé a nabízí přímý přístup k jádru. Některé z balíků jsou velice složité. V následujících odrážkách se stručně seznámíme s některými z nich. Níže uvedené balíky vlastní uživatel SYS. Tyto balíky mají veřejné synonymum, a proto není nutné uvádět jméno schématu při jejich použití. Již například ve verzi Oracle 10g Release 2 bylo přibližně 200 systémových balíků. V těchto balících je mnoho podprogramů, které významně rozšiřují možnosti práce s daty, jejich konverze, administraci serveru a podobně. Databázový server již v dnešní době zdaleka není jen prostým bezpečným úložištěm dat, ale umožňuje i plnit řadu dalších funkcí a může na něm být řešena i nemalá část aplikační logiky. Byť právě tato poslední jmenovaná možnost je předmětem mnoha diskusí mezi programátory a databázovými specialisty. V tabulce níže následuje výběr několika desítek vestavěných balíčků, aby si uživatel udělal představu o možnostech, které vestavěné balíčky nabízí.
David Žák IDAS2/8 – Balíky. Systémové balíky.
5
Název balíku
Popis
DBMS_CRYPTO
Umožňuje šifrování a dešifrování uložených dat
DBMS_DDL
Poskytuje přístup k některým SQL DDL z uložených procedur.
Implementuje server-side debuggery a poskytuje způsob, jak ladit server-side PL / SQL programových jednotek. Implementuje vloženou PL / SQL bránu, která umožňuje webovému DBMS_EPG prohlížeči vyvolat PL / SQL uložené procedury pomocí listeneru HTTP. Poskytuje proceduru, která umožňuje vytvářet tabulku pro DBMS_ERRLOG protokolování chyb tak, aby DML operace mohla pokračovat i po vzniku chyby, bez potřeby odrolování transakce. Umožňuje zkopírovat binární soubor v rámci databáze nebo přenést DMBS_FILE_TRANSFER binární soubor mezi databázemi. Umožňuje flashback na verzi databáze při stanoveném čase nebo DMBS_FLASHBACK zadaném system change numberu (SCN). DBMS_DEBUG
DBMS_JAVA
Poskytuje PL / SQL rozhraní pro přístup k databázi z Javy.
DBMS_JOB
Umožňuje naplánovat administrativní postupy, které mají být provedeny v pravidelných intervalech, ale je také rozhraní pro pracovní fronty.
DBMS_LDAP
Poskytuje funkce a postupy pro přístup k datům z LDAP serveru.
DBMS_LDAP_UTL
Poskytuje Oracle Extension funkce utility pro LDAP.
DBMS_LOB DBMS_METADATA
Poskytuje obecné rutiny pro operace s LOB objekty - BLOB, CLOB (čtení / zápis), a BFILEs (pouze pro čtení). Umožňuje snadno získat kompletní definice databázových objektů (metadata) ze slovníku.
DBMS_OLAP
Poskytuje postupy pro souhrny, dimense a přepisy dotazů.
DBMS_OUTPUT
Akumulace informace ve vyrovnávací paměti tak, že to může být načtena později.
DBMS_RANDOM
Poskytuje vestavěný generátor náhodných čísel.
DBMS_RLS
Poskytuje administrativní rozhraní pro řešení bezpečnosti na úrovni řádků tabulky.
DBMS_ROWID
Poskytuje postupy k vytvoření ROWID a interpretaci jejich obsahu.
DBMS_SCHEDULER DBMS_SESSION
Poskytuje množinu plánovacích funkcí, které jsou volatelné z jakéhokoliv PL / SQL programu. Poskytuje přístup k SQL ALTER SESSION a další informace o relaci z uložených procedur.
DBMS_SQL
Umožňuje použít dynamické SQL pro přístup k databázi.
DBMS_SQLTUNE
Poskytuje rozhraní pro ladění SQL příkazů.
DBMS_STAT_FUNCS
Poskytuje statistické funkce.
DBMS_STATS
Poskytuje mechanismus pro uživatele k prohlížení a úpravě statistik optimalizátoru shromážděných pro databázové objekty.
DBMS_TRACE
Poskytuje rutiny pro spuštění a zastavení PL/SQL trasování.
David Žák IDAS2/8 – Balíky. Systémové balíky.
6
DBMS_XMLDOM
Vysvětluje přístup k objektům XMLType
DBMS_XMLGEN
Převede výsledky SQL dotazu do kanonického formátu XML.
DBMS_XMLPARSER
Vysvětluje přístup k obsahu a struktuře XML dokumentů.
DMBS_XMLQUERY
Poskytuje databáze-na-XMLType funkce.
DBMS_XMLSAVE
Poskytuje XML-na-databázi funkce.
DBMS_XMLSCHEMA
Vysvětluje procedury k registraci a odstranění XML schémat.
DBMS_XMLSTORE
Umožňuje ukládání XML dat v relačních tabulkách.
DBMS_XPLAN
Popisuje, jak formátovat výstup příkazu EXPLAIN PLAN.
DBMS_XSLPROCESSOR Vysvětluje přístup k obsahu a struktuře XML dokumentů. HTMLDB_ITEM
HTMLDB_UTIL
Umožňuje uživatelům vytvářet formulářové prvky dynamicky založené na SQL dotazu místo vytváření jednotlivých položek stránku po stránce. Poskytuje nástroje pro získání a nastavení stavu relace, stahování souborů, kontrolu autorizace uživatelů, obnovení různých stavů uživatelů, a také získání a nastavení předvoleb pro uživatele.
HTP
Hypertextové procedury pro generování HTML tagů.
UTL_DBWS
Poskytuje databázové webové služby.
UTL_ENCODE UTL_FILE UTL_HTTP UTL_I18N UTL_INADDR UTL_LMS
Poskytuje funkce, které kódují RAW data do standardního formátu kódování tak, aby data mohla být přepravována mezi počítači. Umožňuje vašim PL/SQL programům čtení a zápis textových souborů operačního systému. Umožňuje HTTP volání z PL/SQL a SQL pro přístup k datům na internetu nebo volání Oracle webového serveru. Poskytuje sadu služeb (Oracle Globalization Service), která pomáhá vývojářům vytvářet vícejazyčné aplikace. Poskytuje procedury na podporu internetové adresace. Načítá a formátuje chybové zprávy v různých jazycích.
UTL_MAIL
Nástroj pro správu e-mailů, který obsahuje běžně používané emailové funkce, jako například přílohy, CC, BCC, a doručenky.
UTL_SMTP
Poskytuje PL/SQL funkce pro odesílání e-mailů.
UTL_TCP
Poskytuje PL / SQL funkce pro podporu jednoduché TCP/IPkomunikace mezi servery a vnějším světem.
UTL_URL
Poskytuje escape a unescape mechanismy pro URL znaky.
XMLType
Popisuje typy a funkce používané pro podporu nativního XML na serveru.
David Žák IDAS2/8 – Balíky. Systémové balíky.
7
Pojmy k zapamatování Příkazy a funkce:
PL/SQL, balíky, řetězec závislostí
Problém: balíky pro uložení souvisejících objektů, závislosti mezi databázovými objekty
Shrnutí V této lekci jste se seznámili s principy balíků a s vybranými systémovými balíky. Balíky zvětšují obor názvů,, zjednodušují závislosti databázových objektů – přerušují řetězec závislostí, podporují odporují zapouzdření, privátní proměnné a podprogramy, podporují odporují proměnné uchovávané po celou dobu relace, relace spouštěcí kód a seskupení souvisejících funkcí.
Otázky na procvičení 1. 2. 3. 4. 5.
K čemu v PL/SQL slouží balíky? Jaké informacee se o balících vyskytují v datovém slovníku? Jaké elementy mohou balíky obsahovat? Jmenujte příklady 10 systémových balíků? balíků Jakým způsobem mění balíky řetězec zavilostí mezi databázovými objekty? objekty
Odkazy a další studijní prameny • • • • • •
http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/packages.htm# i2432 (syntaxe balíků a jejich možnosti v Oracle 10g R2) http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/intro.htm#i101 0103 (seznamy seznamy systémových balíků v Oracle 10g R2) http://www.oracle-base.com/articles/misc/AutonomousTransactions.php base.com/articles/misc/AutonomousTransactions.php http://www.techonthenet.com/oracle (syntaxe příkazů SQL jazyka a funkcí) http://www.oracle.com/technetwork/database/enterprise http://www.oracle.com/technetwork/database/enterpriseedition/documentation (dokumentace k databázové platformě Oracle) http://www.penguin.cz/noviny/?id=chip/index (seriál Databáze standardu SQL z časopisu CHIP)
Odkazy a další studijní prameny • •
LACKO, L. Oracle, správa, programování a použití databázového systému. systému Praha: a: Computer Press, 2007. ISBN 80-251-1490-2. 80 URMAN, S.,., HARDMAN, R., MCLAUGHLIN, M. Oracle - programování v PL/SQL.. Computer Press, 2008. ISBN 978-80-251-1870-2
David Žák IDAS2/8 – Balíky. Systémové balíky.
8