8. blok Balíky. Systémové 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 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: [<schéma>.]<název_balíku>.< ma>.]<název_balíku>.<název_typu> [<schéma>.]<název_balíku>.< ma>.]<název_balíku>.<název_procedury> [<schéma>.]<název_balíku>.< ma>.]<název_balíku>.<název_funkce> [<schéma>.]<název_balíku>.< ma>.]<název_balíku>.<název_proměnné> 1
Obr. 1. Syntaxe zápisu specifikace balíku Zdroj: Oracle. Obr. 2. Syntaxe zápisu těla balíku Zdroj: Oracle. 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í. 3
Příklad balíku (zdroj Oracle): CREATE OR REPLACE PACKAGE emp_actions AS -- package specification PROCEDURE hire_employee (employee_id 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 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, hire_date, job_id, salary, commission_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 = 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; 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í. 5
Název balíku DBMS_CRYPTO DBMS_DDL DBMS_DEBUG DBMS_EPG DBMS_ERRLOG DMBS_FILE_TRANSFER DMBS_FLASHBACK DBMS_JAVA DBMS_JOB DBMS_LDAP DBMS_LDAP_UTL DBMS_LOB DBMS_METADATA DBMS_OLAP DBMS_OUTPUT DBMS_RANDOM DBMS_RLS DBMS_ROWID DBMS_SCHEDULER DBMS_SESSION DBMS_SQL DBMS_SQLTUNE DBMS_STAT_FUNCS DBMS_STATS DBMS_TRACE Popis Umožňuje šifrování a dešifrování uložených dat 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 prohlížeči vyvolat PL / SQL uložené procedury pomocí listeneru HTTP. Poskytuje proceduru, která umožňuje vytvářet tabulku pro 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 binární soubor mezi databázemi. Umožňuje flashback na verzi databáze při stanoveném čase nebo zadaném system change numberu (SCN). Poskytuje PL / SQL rozhraní pro přístup k databázi z Javy. Umožňuje naplánovat administrativní postupy, které mají být provedeny v pravidelných intervalech, ale je také rozhraní pro pracovní fronty. Poskytuje funkce a postupy pro přístup k datům z LDAP serveru. Poskytuje Oracle Extension funkce utility pro LDAP. 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. Poskytuje postupy pro souhrny, dimense a přepisy dotazů. Akumulace informace ve vyrovnávací paměti tak, že to může být načtena později. Poskytuje vestavěný generátor náhodných čísel. Poskytuje administrativní rozhraní pro řešení bezpečnosti na úrovni řádků tabulky. Poskytuje postupy k vytvoření ROWID a interpretaci jejich obsahu. 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. Umožňuje použít dynamické SQL pro přístup k databázi. Poskytuje rozhraní pro ladění SQL příkazů. Poskytuje statistické funkce. Poskytuje mechanismus pro uživatele k prohlížení a úpravě statistik optimalizátoru shromážděných pro databázové objekty. Poskytuje rutiny pro spuštění a zastavení PL/SQL trasování. 6
DBMS_XMLDOM DBMS_XMLGEN DBMS_XMLPARSER DMBS_XMLQUERY DBMS_XMLSAVE DBMS_XMLSCHEMA DBMS_XMLSTORE DBMS_XPLAN Vysvětluje přístup k objektům XMLType Převede výsledky SQL dotazu do kanonického formátu XML. Vysvětluje přístup k obsahu a struktuře XML dokumentů. Poskytuje databáze-na-xmltype funkce. Poskytuje XML-na-databázi funkce. Vysvětluje procedury k registraci a odstranění XML schémat. Umožňuje ukládání XML dat v relačních tabulkách. 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 HTP 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. Hypertextové procedury pro generování HTML tagů. UTL_DBWS UTL_ENCODE UTL_FILE UTL_HTTP UTL_I18N UTL_INADDR UTL_LMS UTL_MAIL UTL_SMTP UTL_TCP UTL_URL XMLType Poskytuje databázové webové služby. 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. Nástroj pro správu e-mailů, který obsahuje běžně používané e- mailové funkce, jako například přílohy, CC, BCC, a doručenky. Poskytuje PL/SQL funkce pro odesílání e-mailů. Poskytuje PL / SQL funkce pro podporu jednoduché TCP/IPkomunikace mezi servery a vnějším světem. Poskytuje escape a unescape mechanismy pro URL znaky. Popisuje typy a funkce používané pro podporu nativního XML na serveru. 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í zapouzdření, privátní proměnné a podprogramy, podporují proměnné uchovávané po celou dobu relace, spouštěcí kód a seskupení souvisejících funkcí. Otázky na procvičení 1. K čemu v PL/SQL slouží balíky? 2. Jaké informace se o balících vyskytují v datovém slovníku? 3. Jaké elementy mohou balíky obsahovat? 4. Jmenujte příklady 10 systémových balíků? 5. Jakým způsobem mění balíky řetězec zavilostí mezi databázovými 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 systémových balíků v Oracle 10g R2) http://www.oracle-base.com/articles/misc/autonomoustransactions.php http://www.techonthenet.com/oracle (syntaxe příkazů SQL jazyka a funkcí) 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. Praha: a: Computer Press, 2007. ISBN 80-251-1490-2. URMAN, S., HARDMAN, R., MCLAUGHLIN, M. Oracle - programování v PL/SQL.. Computer Press, 2008. ISBN 978-80-251-1870-2 8