Databázové a informační systémy 1. Úvod, PL/SQL I 1/62 DATABÁZOVÉ A INFORMAČNÍ SYSTÉMY Michal Krátký, Radim Bača Katedra informatiky FEI VŠB Technická univerzita Ostrava 2012/2013
Databázové a informační systémy 1. Úvod, PL/SQL I 2/62 DAIS OBSAH PŘEDNÁŠKY 1. Úvod, struktura předmětů, podmínky zápočtu 2. Architektura SŘBD 3. Úvod, vlastnosti. 4. Blok PL/SQL. 5. Anonymní procedury, pojmenované procedury a funkce. 6. Řídící konstrukce. 7. Statické a dynamické PL/SQL. 8. Výjimky
Databázové a informační systémy 1. Úvod, PL/SQL I 3/62 DAIS MICHAL KRÁTKÝ tel.: +420 596 993 239 room: A1004 e-mail: michal.kratky@vsb.cz web: http://www.cs.vsb.cz/kratky/ web databázových předmětů: http://dbedu.cs.vsb.cz/ uživatelské jméno/heslo: student/tuodbedu
Databázové a informační systémy 1. Úvod, PL/SQL I 4/62 DAIS STRUKTURA DATABÁZOVÝCH KURZŮ BAKALÁŘSKÉHO STUDIA 1. Úvod do databázových systémů (3s): konceptuální model, relační datový model, SQL, funkční analýza. 2. Databázové a informační systémy (4s): zotavení, transakce; fyzická implementace SŘBD, datová vrstva IS. 3. Databázové systémy (5s): optimalizace a vykonávání dotazů, fyzický návrh databáze; bezpečnost; XML datový model. 4. Administrace databázových systémů (6s): instalace, konfigurace a ladění nejvýznamnějších SŘBD.
Databázové a informační systémy 1. Úvod, PL/SQL I 5/62 DAIS SŘBD Důraz bude kladen na standard SQL, nicméně v každém kurzu se budeme zabývat různými databázovými systémy: 1. UDBS: SQL Server, 2. DAIS, DBS: Oracle, SQL Server, 3. ADBS: Oracle, SQL Server, MySQL. Důraz bude kladen na praktickou implementaci.
Databázové a informační systémy 1. Úvod, PL/SQL I 6/62 DAIS PŘEDNÁŠEJÍCÍ DATABÁZOVÝCH KURZŮ Radim Bača Radoslav Fasuga Peter Chovanec Michal Krátký, garant databázových předmětů bakalářského studia
Databázové a informační systémy 1. Úvod, PL/SQL I 7/62 DAIS PODMÍNKY UDĚLENÍ ZÁPOČTU Předmět je ukončen zkouškou. Minimum 30 z 55b. Maximální počet bodů na zápočet je 45: 1. 2 praktickým test (PL/SQL, T-SQL). Minimum: 6b z 10. 2. Implementace informačního systému nad platformou.net (nebo J2EE). Důraz bude kladen na implementaci datové vrstvy. Minimum 13b z 25.
Databázové a informační systémy 1. Úvod, PL/SQL I 8/62 DAIS PROGRAM PŘEDNÁŠEK A CVIČENÍ PL/SQL, T-SQL Zotavení, transakce, ACID Objektově-relační datový model Datová vrstva informačního systému, objektově-relační mapování Webový informační systém: ASP.NET (J2EE) Fyzický model SŘBD, vykonávání dotazů
Databázové a informační systémy 1. Úvod, PL/SQL I 9/62 DAIS ZÁPOČET 1/2 První polovina semestru bude ukončena praktickým testem z PL/SQL (4. týden) a T-SQL (7. týden). Je možná pouze jedna oprava. Týden před testem bude zveřejněn logický model, vylosované zadání musí být vypracováno do 1h:15min. Pouze funkční a správné řešení (kód jde přeložit, spustit a dává korektní výsledky) je hodnoceno počtem bodů vyšším než je minimum.
Databázové a informační systémy 1. Úvod, PL/SQL I 10/62 DAIS ZÁPOČET 2/2 Druhá polovina semestru bude ukončena odevzdáním semestrálního projektu - webového informačního systému s důrazem na implementaci datové vrstvy: ASP.NET (J2EE). Pro obě platformy jsou k dispozici šablony projektů.
Databázové a informační systémy 1. Úvod, PL/SQL I 11/62 DAIS DOSTUPNÝ HARDWARE A SOFTWARE 1. Servery pro výuku databázových předmětů: dbedu.cs.vsb.cz: 2 Intel Xeon X5670 2.93GHz 6C, celkem tedy 12 jader, 64GB paměti dbsys.cs.vsb.cz: 2 Intel Xeon E5 2690 2.9GHz, 2 12C, 288GB paměti (pro každý SŘBD vyhraženo přibližně 9GB). 2. Oracle 11G R2 x64 Enterprise Edition, SQL Server 2012 3. Oracle SQL Developer 1, Microsoft Management Studio 1 http://www.oracle.com/technetwork/developer-tools/ sql-developer/overview/index.html
Databázové a informační systémy 1. Úvod, PL/SQL I 12/62 DAIS ORACLE ACADEMY 1. Od srpna 2009 je katedra účastníkem Oracle Academy. 2. Studenti mají přístup k materiálům komerčních kurzů, dostupné na http://dbedu.cs.vsb.cz/ 3. V září budou otevřeny kurzy Database Design a Database Programming. Pokud máte zájem, napište mail Radoslavu Fasugovi (radoslav.fasuga@vsb.cz).
Databázové a informační systémy 1. Úvod, PL/SQL I 13/62 DAIS LITERATURA 1. M. Krátký, R. Bača: Databázové systémy, http://dbedu.cs.vsb.cz/, odkaz Literatura/Studijní literatura - momentálně 258 stran pokrývající všechny kurzy, bude se postupně rozšiřovat. 2. C.J. Date: An Introduction to Database Systems. Addison Wesley, 2003. 3. H. Garcia-Molina, J.D. Ullman, J. Widom: Database systems: the complete book. Prentice Hall, 2002. 4. J. Pokorný: Dotazovací jazyky. Nakladatelství Univerzity Karlovy, Praha, ISBN 80-246-0497-3, 2002. 5. Dokumentace k Oracle 11g: http://www.oracle.com/pls/db112/portal.all_books.
Databázové a informační systémy 1. Úvod, PL/SQL I 14/62 DAIS ARCHITEKTURA IS Prezentační vrstva Model aplikace Objektově-relační mapování (ORM) UDB DBMS DAIS DBMS, datová vrstva, model, prezentační vrstva DBS DBMS ADBS DBMS Datová vrstva DBMS
Databázové a informační systémy 1. Úvod, PL/SQL I 15/62 DAIS ARCHITEKTURA SŘBD dotazy, modifikace dat (příkazy JMD) Uživatel/aplikace příkazy pro transakce Administrátor databáze příkazy JDD plán vyhodnocení dotazu požadavky na soubory a záznamy Překladač dotazu Vyhodnocování dotazu Manažer indexů, souborů a záznamů požadavky na stránky Manažer vyrovnávacích pamětí čtení/zápis stránky Manažer úložiště dat Metadata statistiky Transakční manažer Manažer log souborů a zotavení Vyrovnávací paměti stránky logovacícho souboru JDD překladač Manažer paralelního přístupu Tabulka zámků Úložiště dat
Databázové a informační systémy 1. Úvod, PL/SQL I 16/62 PL/SQL, blok, proměnné PROCEDURÁLNÍ ROZŠÍŘENÍ SQL PL/SQL 1. Jazyk PL/SQL 2 představuje rozšíření jazyka SQL o procedurální rysy. 2. Syntaxe PL/SQL je založena na jazyku ADA. 3. Podobná procedurální rozšíření pak byla vyvinuta i pro další relační databáze: Transact-SQL pro Sybase a Microsoft SQL Server, PL/pgSQL pro PostgreSQL a SQL PL pro IBM DB2. 2 http://www.oracle.com/pls/db112/portal.all_books, PL/SQL Language Reference
Databázové a informační systémy 1. Úvod, PL/SQL I 17/62 PL/SQL, blok, proměnné VLASTNOSTI PL/SQL Výhody: Snadná a efektivní kombinace procedurální logiky a SQL. Možné nižší množství přenášených dat (přenáší se jen konečné výsledky) PL/SQL kód je uložen v SŘBD. Sdílení kódu mezi aplikacemi. Nezávislost na platformě. Nevýhody: Horší přenositelnost aplikace mezi SŘBD různých výrobců (to je ovšem problém i na úrovni SQL). Potřebujeme přenositelnost mezi SŘBD?
Databázové a informační systémy 1. Úvod, PL/SQL I 18/62 PL/SQL, blok, proměnné Blok PL/SQL ZÁKLADNÍ STRUKTURA PL/SQL BLOKU 1. DECLARE nepovinná deklarace lokálních proměnných a kurzorů, 2. BEGIN povinné otevření bloku příkazů uložené procedury, 3. EXCEPTION nepovinné zachytávání výjimek, 4. END povinné ukončení bloku procedury.
Databázové a informační systémy 1. Úvod, PL/SQL I 19/62 PL/SQL, blok, proměnné Blok PL/SQL PŘÍKLAD, TRANSAKCE V PL/SQL Při vložení nové osoby chceme zároveň přidat této osobě roli "Autor" (která má id=1). Transakce tedy bude vypadat takto: BEGIN INSERT INTO Person VALUES( sob28, jan. sobota@vsb. cz, heslo, Jan, NULL, Sobota, NULL, NULL ) ; INSERT INTO PersonRole ( son28, 1 ) ; COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK; END; Pokud selže vložení osoby (např. osoba je už v systému evidována), pak vložení role osoby nedává smysl a celá transakce bude zrušena.
Databázové a informační systémy 1. Úvod, PL/SQL I 20/62 PL/SQL, blok, proměnné Blok PL/SQL POZNÁMKY BEGIN jednoradkova poznamka INSERT INTO Person VALUES( sob28, jan. sobota@vsb. cz, heslo, Jan, NULL, Sobota, NULL, NULL ) ; / viceradkova poznamka / INSERT INTO PersonRole ( son28, 1 ) ; COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK; END;
Databázové a informační systémy 1. Úvod, PL/SQL I 21/62 PL/SQL, blok, proměnné SET AUTOCOMMIT ON SET AUTOCOMMIT ON/OFF Po spuštění SET AUTOCOMMIT ON, bude každý SQL příkaz proveden v jedné transakci. Tzn. operace COMMIT a ROLLBACK pozbývají významu. Po spuštění SET AUTOCOMMIT OFF, začíná transakce po ukončení transakce předchozí a končí operacemi COMMIT nebo ROLLBACK.
Databázové a informační systémy 1. Úvod, PL/SQL I 22/62 PL/SQL, blok, proměnné Proměnné v PL/SQL PROMĚNNÉ V sekci DECLARE můžeme definovat proměnné, jenž mohou být použity v proceduře. Definice má následující tvar: jmeno_promenne typ_promenne [NOT NULL : = hodnota ] ; Kde: jmeno_promenne je název proměnné, který má obvykle prefix v_ 3, typ_promenne je platný typ proměnné, hodnota je nepovinná část, která definuje výchozí hodnotu proměnné. 3 Oracle Academy: Oracle Database 10g: Advanced PL/SQL, Student Guide. str. 26.
Databázové a informační systémy 1. Úvod, PL/SQL I 23/62 PL/SQL, blok, proměnné Proměnné v PL/SQL PROMĚNNÉ 1/2 Proměnné můžeme využít při běhu PL/SQL kódu pro uložení dočasných hodnot a pro manipulaci s nimi. Hodnota může být do proměnné zapsána několika způsoby: Syntaxe Příklad jmeno_promenne := hodnota v_vek := 20 SELECT sloupec SELECT vek INTO v_vek INTO jmeno_promenne FROM student FROM jmeno_tabulky WHERE login LIKE bon007 SELECT musí vracet právě jeden záznam, jinak je vygenerována výjimka NO_DATA_FOUND resp. TOO_MANY_ROWS.
Databázové a informační systémy 1. Úvod, PL/SQL I 24/62 PL/SQL, blok, proměnné Proměnné v PL/SQL PROMĚNNÉ 2/2 Při práci s proměnnou můžeme využít standardní aritmetické operátory v případě čísel. Dále můžeme využít operátor pro konkatenaci řetězců a také standardní SQL funkce (TO_CHAR, TO_DATE, SUBSTR, LENGTH, atd.).
Databázové a informační systémy 1. Úvod, PL/SQL I 25/62 PL/SQL, blok, proměnné Proměnné v PL/SQL PROMĚNNÉ, PŘÍKLAD DECLARE v_fname VARCHAR2( 2 0 ) ; v_lname VARCHAR2( 2 0 ) ; v_email VARCHAR2( 6 0 ) ; BEGIN SELECT fname, lname INTO v_fname, v_lname FROM student WHERE l o g i n = bon007 ; v_email := v_fname. v_lname @vsb. cz ; UPDATE student set email = v_email WHERE l o g i n = bon007 ; END;
Databázové a informační systémy 1. Úvod, PL/SQL I 26/62 PL/SQL, blok, proměnné Proměnné v PL/SQL OPERÁTOR %TYPE Zadávání datových typů proměnných může být problematické: datové typy velmi často kopírují datové typy atributů tabulek. Při změně datového typu atributu v tabulce pak musíme měnit kód. Proto namísto konkrétního datového typu používáme operátor %TYPE. Příklad: v_lg Student.login%TYPE;... Kde proměnná v_lg je stejného typu jako atribut login tabulky Student.
Databázové a informační systémy 1. Úvod, PL/SQL I 27/62 PL/SQL, blok, proměnné Proměnné v PL/SQL OPERÁTOR %ROWTYPE V některých případech používáme strukturovaný datový typ, který obsahuje proměnné stejných datových typů jako jsou datové typy atributů tabulek. Instance takového strukturovaného datového typu reprezentuje záznam z tabulky. V tomto případě můžeme použít operátor %ROWTYPE. Výsledkem je typ se stejnými proměnnými a typy jako má tabulka na kterou je operátor aplikován. Příklad: v_st Student%ROWTYPE;... Kde proměnná v_st obsahuje stejné proměnné a datový typy jako tabulka Student.
Databázové a informační systémy 1. Úvod, PL/SQL I 28/62 PL/SQL, blok, proměnné Proměnné v PL/SQL PROMĚNNÉ, PŘÍKLAD DECLARE C_VCHAR_MAXLEN CONSTANT NUMBER : = 32767; v_ date DATE : = SYSDATE; v_number NUMBER NOT NULL : = 1; v_student Student%ROWTYPE; v_name Student. name%type; BEGIN... END;
Databázové a informační systémy 1. Úvod, PL/SQL I 29/62 Procedury PROCEDURY PL/SQL umožňuje vytvářet několik typů procedur. V zásadě se liší především způsobem jakým jsou spouštěny: Anonymní procedury Pojmenované procedury Pojmenované funkce
Databázové a informační systémy 1. Úvod, PL/SQL I 30/62 Procedury Anonymní Procedury ANONYMNÍ PROCEDURY Anonymní procedury jsou nepojmenované procedury, které nemohou být volány z jiné procedury. Tyto procedury mohou být uloženy v souboru, nebo přímo zapsány na příkazový řádek, a spouštěny z klienta (např. Oracle SQL Developer). Anonymní procedury nejsou předkompilovány a mohou být proto pomalejší než pojmenované procedury a funkce.
Databázové a informační systémy 1. Úvod, PL/SQL I 31/62 Procedury Anonymní Procedury PŘÍKLAD 1 Mějme anonymní proceduru, která vkládá email do tabulky Email s jedním atributem email typu VARCHAR2(30). DECLARE v_name VARCHAR2( 30) := michal. kratky@vsb. cz ; BEGIN INSERT INTO Email VALUES ( v_name ) ; END;
Databázové a informační systémy 1. Úvod, PL/SQL I 32/62 Procedury Anonymní Procedury PŘÍKLAD 2 V druhé proceduře vložíme do tabulky Email adresu studenta z tabulky Student s emailem bon007. Tabulka Student má dva atributy: email typu VARCHAR2(30) a login typu CHAR(6). DECLARE v _ l o g i n CHAR( 6 ) := bon007 ; BEGIN INSERT INTO emaily SELECT email FROM Student WHERE l o g i n = v _ l o g i n ; END;
Databázové a informační systémy 1. Úvod, PL/SQL I 33/62 Procedury Pojmenované procedury POJMENOVANÉ PROCEDURY Pojmenované procedury obsahují hlavičku se jménem a parametry procedury. Takovouto proceduru je možné volat z jiných procedur nebo spouštět příkazem EXECUTE (zkráceně EXEC). Na rozdíl od anonymních procedur jsou pojmenované procedury předkompilovány a uloženy v databázi.
Databázové a informační systémy 1. Úvod, PL/SQL I 34/62 Procedury Pojmenované procedury STRUKTURA POJMENOVANÉ PROCEDURY 1/4 CREATE [OR REPLACE] PROCEDURE jmeno_procedury [ ( jmeno_parametru [ mod ] datovy_typ,... ) ] IS AS d e f i n i c e l o k á l n í c h proměnných BEGIN t ě l o procedury END [ jmeno_procedury ] Kde: jmeno_parametru je název parametru, který má obvykle prefix p_ 4. 4 Oracle Academy: Oracle Database 10g: Advanced PL/SQL, Student Guide. str. 26.
Databázové a informační systémy 1. Úvod, PL/SQL I 35/62 Procedury Pojmenované procedury STRUKTURA POJMENOVANÉ PROCEDURY 2/4 CREATE [OR REPLACE] PROCEDURE jmeno_procedury [ ( jmeno_parametru [ mod ] datovy_typ,... ) ] IS AS d e f i n i c e l o k á l n í c h proměnných BEGIN t ě l o procedury END [ jmeno_procedury ] Kde: mod je mód parametru, který může mít hodnotu IN (vstupní proměnná), OUT (výstupní proměnná) nebo IN OUT (vstupně výstupní proměnná).
Databázové a informační systémy 1. Úvod, PL/SQL I 36/62 Procedury Pojmenované procedury STRUKTURA POJMENOVANÉ PROCEDURY 3/4 CREATE [OR REPLACE] PROCEDURE jmeno_procedury [ ( jmeno_parametru [ mod ] datovy_typ,... ) ] IS AS d e f i n i c e l o k á l n í c h proměnných BEGIN t ě l o procedury END [ jmeno_procedury ] Kde: datovy_typ je platný datový typ proměnné. Proměnné typu VARCHAR2 nebo NUMBER se uvádějí bez závorek, které by specifikovaly jejich velikost.
Databázové a informační systémy 1. Úvod, PL/SQL I 37/62 Procedury Pojmenované procedury STRUKTURA POJMENOVANÉ PROCEDURY 4/4 CREATE [OR REPLACE] PROCEDURE jmeno_procedury [ ( jmeno_parametru [ mod ] datovy_typ,... ) ] IS AS d e f i n i c e l o k á l n í c h proměnných BEGIN t ě l o procedury END [ jmeno_procedury ] Vstupní proměnné jsou v PL/SQL implicitně předávány odkazem, za běžných okolností ale není možné měnit hodnoty těchto proměnných. Za klíčovým slovem AS (nebo IS) pak můžeme specifikovat lokální proměnné.
Databázové a informační systémy 1. Úvod, PL/SQL I 38/62 Procedury Pojmenované procedury PŘÍKLAD 1/2 Tato pojmenovaná procedura vkládá email studenta jehož login předáváme jako parametr. CREATE OR REPLACE PROCEDURE I n s e r t E m a i l ( p_login VARCHAR2) AS v_email VARCHAR2( 6 0 ) ; BEGIN SELECT email INTO v_email FROM Student WHERE l o g i n = p_login ; INSERT INTO Email VALUES( v_email ) ; END;
Databázové a informační systémy 1. Úvod, PL/SQL I 39/62 Procedury Pojmenované procedury PŘÍKLAD 2/2 Uloženou proceduru pak můžeme (pokud máme právo přístupu) spustit příkazem EXECUTE (nebo EXEC). EXECUTE I n s e r t E m a i l ( jan440 ) ;
Databázové a informační systémy 1. Úvod, PL/SQL I 40/62 Procedury Pojmenované procedury PŘEKLAD PROCEDUR Uloženou proceduru v klientském prostředí (jako je Oracle SQL Developer) vytvoříme spuštěním kódu začínajícím CREATE a končícím END;. Takto spuštěná procedura je přeložena a uložena v databázi. Při překladu se mohou objevit chyby, které zobrazíme v Oracle SQL Developeru v okně log.
Databázové a informační systémy 1. Úvod, PL/SQL I 41/62 Procedury Funkce FUNKCE Funkce (přesněji řečeno pojmenované funkce) jsou velmi podobné procedurám. Oproti procedurám specifikují návratový typ a musí vracet hodnotu. Struktura funkce: CREATE [OR REPLACE] FUNCTION jmeno_funkce [ ( jmeno_parametru [ mod ] datovy_typ,... ) ] RETURN navratovy_ datovy_ typ IS AS d e f i n i c e l o k á l n í c h proměnných BEGIN t ě l o procedury END [ jmeno_procedury ]
Databázové a informační systémy 1. Úvod, PL/SQL I 42/62 Procedury Funkce PŘÍKLAD 1/2 Tato pojmenovaná funkce vrací email studenta jehož login předáváme jako parametr. CREATE OR REPLACE FUNCTION GetStudentEmail ( p_login IN student. l o g i n%type) RETURN student. email%type AS v_email student. email%type; BEGIN SELECT email INTO v_email FROM student WHERE l o g i n = p_login ; RETURN v_email ; END GetStudentEmail ;
Databázové a informační systémy 1. Úvod, PL/SQL I 43/62 Procedury Funkce PŘÍKLAD 2/2 Uloženou proceduru pak můžeme (pokud máme právo přístupu) spustit příkazem EXECUTE. SET SERVEROUTPUT ON; EXECUTE DBMS_OUTPUT. PUT_LINE ( GetStudentEmail ( sob28 ) ) ; Prvním příkazem povolujeme standardní výstup serveru a druhým příkazem voláme uloženou funkci a vypisujeme výsledek.
Databázové a informační systémy 1. Úvod, PL/SQL I 44/62 Procedury Funkce VOLÁNÍ PL/SQL PROCEDUR A FUNKCÍ Pomocí anonymního bloku: BEGIN InsertEmail( jan440 ); END; Pomocí SQL: SELECT InsertEmail( jan440 ) FROM DUAL; V Oracle SQL Developer či SQL*Plus: EXEC InsertEmail( jan440 );
Databázové a informační systémy 1. Úvod, PL/SQL I 45/62 Řídící konstrukce, statické vs dynamické SQL, výjimky Základní řídící konstrukce ZÁKLADNÍ ŘÍDÍCÍ KONSTRUKCE V PL/SQL můžeme použít několik základních řídících konstrukcí jako je podmínka a cyklus. Jejich syntaxe se výrazně neliší od podobných konstrukcí v jiných programovacích jazycích.
Databázové a informační systémy 1. Úvod, PL/SQL I 46/62 Řídící konstrukce, statické vs dynamické SQL, výjimky Základní řídící konstrukce PODMÍNKA Podmínka má následující syntaxi: I F podminka1 THEN příkazy [ ELSIF podminka2 THEN příkazy ] [ELSE příkazy ] END IF ;
Databázové a informační systémy 1. Úvod, PL/SQL I 47/62 Řídící konstrukce, statické vs dynamické SQL, výjimky Základní řídící konstrukce CYKLY 1/3 V zásadě máme k dispozici tři druhy cyklů. První typ cyklu se ukončuje pomocí klíčového slova EXIT. Podmínka ukončení cyklu může být zapsána pomocí EXIT WHEN podminka. Takto můžeme zapsat cyklus s podmínkou na konci. LOOP příkazy cyklu [ EXIT ; EXIT WHEN podminka ; ] END LOOP;
Databázové a informační systémy 1. Úvod, PL/SQL I 48/62 Řídící konstrukce, statické vs dynamické SQL, výjimky Základní řídící konstrukce CYKLY 2/3 Dalším typem je cyklus s podmínkou na začátku. WHILE podminka LOOP příkazy cyklu END LOOP;
Databázové a informační systémy 1. Úvod, PL/SQL I 49/62 Řídící konstrukce, statické vs dynamické SQL, výjimky Základní řídící konstrukce CYKLY 3/3 Posledním běžně používaným typem cyklu je cyklus FOR, kde předem známe počet iterací. Proměnná value1 představuje výchozí hodnotu proměnné jmeno_promenne a value2 koncovou hodnotu. FOR jmeno_promenne IN [ REVERSE] value1.. value2 LOOP příkazy cyklu END LOOP;
Databázové a informační systémy 1. Úvod, PL/SQL I 50/62 Řídící konstrukce, statické vs dynamické SQL, výjimky Základní řídící konstrukce CYKLY, PŘÍKLAD Průchod řádky výsledku dotazu. BEGIN FOR radek IN ( SELECT a, b from TAB) LOOP IF radek. a =... THEN <command>; END IF ; END LOOP; END;
Databázové a informační systémy 1. Úvod, PL/SQL I 51/62 Řídící konstrukce, statické vs dynamické SQL, výjimky Statické a dynamické PL/SQL STATICKÉ PL/SQL V PL/SQL bloku nemůžeme přímo volat všechny dostupné SQL příkazy. Příkazy, které lze volat v PL/SQL přímo nazýváme statické příkazy PL/SQL. Mezi statické příkazy patří: SELECT, INSERT, UPDATE, DELETE, MERGE LOCK TABLE, COMMIT, ROLLBACK, SAVEPOINT, SET TRANSACTION Je zřejmé, že mezi příkazy které nemůžeme volat přímo jsou všechny příkazy DDL.
Databázové a informační systémy 1. Úvod, PL/SQL I 52/62 Řídící konstrukce, statické vs dynamické SQL, výjimky Statické a dynamické PL/SQL DYNAMICKÉ PL/SQL Dynamické PL/SQL umožňuje sestavit a volat jakýkoli SQL příkaz (na který má uživatel právo) za běhu aplikace. Tento způsob může být zejména užitečný pokud předem neznáme přesný tvar SQL příkazu, který má být volán. Nevýhodou je, že nelze jednoduše ověřit syntaktickou správnost a sémantické vazby mezi objekty (správné datové typy, počet parametrů atd.). Navíc se vystavujeme nebezpečí SQL injection! Ve většině případů spouštíme dynamické PL/SQL příkazem EXECUTE IMMEDIATE. Upozornění: Dynamické PL/SQL používáme jen v případě, kdy není možné použít statické PL/SQL!
Databázové a informační systémy 1. Úvod, PL/SQL I 53/62 Řídící konstrukce, statické vs dynamické SQL, výjimky Statické a dynamické PL/SQL DYNAMICKÉ PL/SQL, PŘÍKLAD V tomto příkladě vytvoříme a odstraníme tabulky s použitím příkazu EXECUTE IMMEDIATE. DECLARE v_command VARCHAR2( 5 0 ) ; BEGIN EXECUTE IMMEDIATE Create t a b l e book ( i d INT UNIQUE, name VARCHAR2( 5 0 ), author INT REFERENCES author ( author_id ) ) ; v_command : = DROP TABLE book ; EXECUTE IMMEDIATE v_command ; END;
Databázové a informační systémy 1. Úvod, PL/SQL I 54/62 Řídící konstrukce, statické vs dynamické SQL, výjimky Výjimky VÝJIMKY Výjimka je chyba, která se vyskytne během provádění PL/SQL kódu. Jazyk PL/SQL nabízí vlastní mechanismus pro zpracování výjimek. Výjimka může vzniknout jak v samotném Oracle serveru (chyba provádění nějakého SQL dotazu), tak může být vytvořena samotným PL/SQL kódem.
Databázové a informační systémy 1. Úvod, PL/SQL I 55/62 Řídící konstrukce, statické vs dynamické SQL, výjimky Výjimky ČÁST EXCEPTION Ke zpracování výjimek v PL/SQL bloku slouží část EXCEPTION.... BEGIN... EXCEPTION WHEN jmeno_vyjimky THEN zpracování vyjímky END; V případě chyby program automaticky skočí do této části, konkrétně do části, která zpracovává danou výjimku (pokud taková část existuje).
Databázové a informační systémy 1. Úvod, PL/SQL I 56/62 Řídící konstrukce, statické vs dynamické SQL, výjimky Výjimky ČÁST EXCEPTION... BEGIN... EXCEPTION WHEN jmeno_vyjimky THEN zpracování vyjímky END; V případě úspěšného zpracování se výjimka již dále nepropaguje do částí aplikace, které PL/SQL blok volaly. V případě že chceme zpracovat jakoukoli výjimku (kromě těch co již jsou zpracovány jinými WHEN příkazy), pak namísto jmeno_vyjimky dáme klíčové slovo OTHERS.
Databázové a informační systémy 1. Úvod, PL/SQL I 57/62 Řídící konstrukce, statické vs dynamické SQL, výjimky Výjimky VÝJIMKY BALÍKU STANDARD V této tabulce vidíme některé výjimky balíku STANDARD. Jméno výjimky Číslo chyby Popis ACCESS_INTO_NULL ORA-06530 Pokus o přiřazení hodnoty do neinicializovaného objektu DUP_VAL_ON_INDEX ORA-00001 Pokus vložit duplicitní hodnotu INVALID_CURSOR ORA-01001 Neplatná operace s kurzorem INVALID_NUMBER ORA-01722 Selhala konverze čísla na řetězec NO_DATA_FOUND ORA-01403 Příkaz SELECT nevrátil data TOO_MANY_ROWS ORA-01422 Příkaz SELECT INTO vrátil více než jeden řádek VALUE_ERROR ORA-06502 Chybná manipulace s hodnotou
Databázové a informační systémy 1. Úvod, PL/SQL I 58/62 Řídící konstrukce, statické vs dynamické SQL, výjimky Výjimky ZACHYCENÍ VÝJIMKY Následující procedura vypíše zprávu Hodnota atributu login musí být unikátní! v případě výjimky DUP_VAL_ON_INDEX. V případě jiné výjimky vypíše chybovou hlášku dané chyby. BEGIN I n s e r t i n t o student ( l o g i n, fname, lname ) values ( bon007, James, Bond ) ; EXCEPTION WHEN DUP_VAL_ON_INDEX THEN DBMS_OUTPUT. p u t _ l i n e ( Hodnota a t r i b u t u l o g i n musí být u n i k á t n í! ) ; WHEN OTHERS THEN DBMS_OUTPUT. p u t _ l i n e ( DBMS_UTILITY.FORMAT_ERROR_STACK) ; END;
Databázové a informační systémy 1. Úvod, PL/SQL I 59/62 Řídící konstrukce, statické vs dynamické SQL, výjimky Výjimky VYVOLÁNÍ VÝJIMKY PL/SQL umožňuje vyvolat výjimku v případě chyby. K tomuto účelu se používá klíčové slovo RAISE. Je možné tak vyvolat standardní nebo uživatelem definovanou výjimku.
Databázové a informační systémy 1. Úvod, PL/SQL I 60/62 Řídící konstrukce, statické vs dynamické SQL, výjimky Výjimky VÝJIMKA DEFINOVANÁ UŽIVATELEM Stejně jako proměnné nebo kurzory je možné v PL/SQL bloku definovat také výjimku. Výjimka se tedy deklaruje spolu s ostatními proměnnými. Syntaxe je následují: jmeno_vyjimky EXCEPTION; Rozsah platnosti výjimky je jen pro danou proceduru. Pokud budeme chtít výjimku deklarovanou v proceduře odchytit mimo tuto proceduru, pak je to možné jen s použitím OTHERS.
Databázové a informační systémy 1. Úvod, PL/SQL I 61/62 Řídící konstrukce, statické vs dynamické SQL, výjimky Výjimky PŘÍKLAD V následujícím výpise dojde k vyvolání výjimky too_many_records, která není v proceduře ošetřena. Výjimka tedy bude propagována do nadřazeného kódu. DECLARE too_many_records EXCEPTION; v_records INT ; BEGIN Select count ( ) i n t o v_records from student ; IF v_records > 20 THEN r a i s e too_many_records ELSE I n s e r t i n t o student ( l o g i n, fname, lname ) values ( bon007, James, Bond ) ; END IF ; END;
Databázové a informační systémy 1. Úvod, PL/SQL I 62/62 REFERENCE Portál materiálů k Oracle: http://www.oracle.com/pls/ db112/portal.all_books PL/SQL Language Reference PL/SQL Packages and Types Reference