, Marek Rychlý Vysoké učení technické v Brně Fakulta informačních technologií Ústav informačních systémů Demo-cvičení pro IDS 9. dubna 2014 Marek Rychlý Stored Procedures & Database Triggers, Demo-cvičení pro IDS, 9. dubna 1 / 2014 18
Obsah 1 Stored Procedures & Database Triggers 2 Tvorba tiskových sestav Spuštění tiskových sestav 3 Marek Rychlý Stored Procedures & Database Triggers, Demo-cvičení pro IDS, 9. dubna 2 / 2014 18
Stored Procedures & Database Triggers Uložené procedury/funkce pro zpracování dat v databázi. (na rozdíl od zpracování až v aplikaci využívající databázi) pro složitá integritní omezení a reakce. (spouští se v reakci na plánované nebo provedené změny dat) Obojí je uloženo v databázi, jsou to objekty schématu databáze. (tj. na db. serveru, sdílené přistupujícími aplikacemi) Procedura a trigger obsahují blok kódu v jazyce PL/SQL. (po hlavičce následuje struktura DECLARE, BEGIN, END) Bloky PL/SQL jsou prováděny atomicky. (tj. bud se provede vše, nebo nic, např. při vyvolání výjimky) Marek Rychlý Stored Procedures & Database Triggers, Demo-cvičení pro IDS, 9. dubna 4 / 2014 18
PL/SQL Engine v Oracle Database (diagram převzat z Oracle8i Concepts, Release 8.1.5) Marek Rychlý Stored Procedures & Database Triggers, Demo-cvičení pro IDS, 9. dubna 5 / 2014 18
Uložené procedury create [or replace] procedure jmenoproc(param1 [in out in out] typ,... ) is... replace vhodnější než drop a create protože stejný objekt (např. nezruší práva definovaná nad objektem atp., což by drop udělal) parametry mohou být vstupní, výstupní, nebo vstupně výstupní (pokud neuvedeno in, out, nebo in out, tak jsou implicitně jen vstupní) datový typ může být odkaz na datový typ sloupce nějaké tabulky (toto funguje i jinde v PL/SQL, např. pro deklaraci proměnných uvnitř bloku) za datovým typem může být nastavena hodnota DEFAULT expr create or replace PROCEDURE reset_study( student IN STUDY.STUDENT_ID%TYPE, program IN STUDY.PROGRAM_CODE%TYPE DEFAULT IT-BC-3 ) IS initial_year STUDY.YEAR%TYPE := 1; BEGIN update study set year = initial_year where student_id = student and program_code = program; END; Marek Rychlý Stored Procedures & Database Triggers, Demo-cvičení pro IDS, 9. dubna 6 / 2014 18
Uložené funkce Stored Procedures & Database Triggers create [or replace] fucntion jmenofce(... ) return typ is... parametry a tělo stejně jako u uložené procedury (vč. vstupních a výstupních parametrů, atd.) typ návratové hodnoty nesmí mít uvedenu délku či přesnost (délka či přesnost dle místa volání funkce, resp. uložení její návratové hodnoty) může vracet také celou tabulku, datový typ pak tabulka objektů (tzv. pipelined table functions ) create or replace FUNCTION first_year_students_count( program IN STUDY.PROGRAM_CODE%TYPE DEFAULT IT-BC-3 ) RETURN int IS initial_year STUDY.YEAR%TYPE := 1; students_count int; BEGIN select count(*) into students_count from study where year = initial_year and program_code = program; return students_count; END; Marek Rychlý Stored Procedures & Database Triggers, Demo-cvičení pro IDS, 9. dubna 7 / 2014 18
Spouštění uložených procedur a funkcí Procedury i funkce lze volat přímo v PL/SQL blocích. (v anonymních blocích, procedurách, fcích, či triggerech, ale i v Oracle Forms) Volání funkce v PL/SQL bloku musí uchovat návratovou hodnotu. (např. do proměnné prostředí, tj. přiřadit volání fce pom. := do proměnné) Funkce lze navíc volat z SQL dotazů či příkazů. (tj. v SELECT/UPDATE/DELETE, např. SELECT fce(123) FROM dual;) DECLARE v_return int; BEGIN v_return := FIRST_YEAR_STUDENTS_COUNT( PROGRAM => IT-BC-3 ); :output_variable_return = v_return; END; (při volání v SQLDeveloper, je výsledek viditelný v záložce Output Variables) Marek Rychlý Stored Procedures & Database Triggers, Demo-cvičení pro IDS, 9. dubna 8 / 2014 18
Triggery vyvolány modifikací dat tabulky (nebo pohledu). (vázány na akci DELETE/INSERT/UPDATE tabulky nebo pohledu) před nebo po modifikaci každého řádku ovlivněného akcí (tj. BEFORE/AFTER akce DELETE/INSERT/UPDATE ) před, po, nebo místo akce, která vyvolala trigger (tj. BEFORE/AFTER/INSTEAD OF akce DELETE/INSERT/UPDATE ) Marek Rychlý Stored Procedures & Database Triggers, Demo-cvičení pro IDS, 9. dubna 9 / 2014 18
Pořadí volání triggerů Při akci DELETE/INSERT/UPDATE nad tabulkou/pohledem 1 jsou zavolány triggery BEFORE DELETE/INSERT/UPDATE 2 jsou zavolány triggery INSTEAD OF DELETE/INSERT/UPDATE nebo jsou pro každý řádek tabulky ovlivněný akcí jsou zavolány 1 triggery BEFORE DELETE/INSERT/UPDATE FOR EACH ROW 2 triggery AFTER DELETE/INSERT/UPDATE FOR EACH ROW 3 jsou zavolány triggery AFTER DELETE/INSERT/UPDATE V těle triggerů FOR EACH ROW jsou dostupná původní a nová (modifikovaná) data pomocí proměnných prostředí :NEW a :OLD. Marek Rychlý Stored Procedures & Database Triggers, Demo-cvičení pro IDS, 9. dubna 10 / 2014 18
Použítí triggerů Stored Procedures & Database Triggers Automatické generování obsahů sloupců. (např. IF :NEW.sloupec IS NULL THEN :NEW.sloupec := myseq.nextval;) Ošetření nesprávných transakcí. (např. raise_application_error(-20000, error msg );) Dosažení komplexní autorizace. Zvýšení referenční integrity. Transparentní záznam událostí. Auditing. Replikace dat. Statistika přístupu k tabulkám. Triggery lze pověsit na více akcí akce, která vyvolala trigger, lze odlišit v kódu pom. predikátů INSERTING, DELETING a UPDATING. Marek Rychlý Stored Procedures & Database Triggers, Demo-cvičení pro IDS, 9. dubna 11 / 2014 18
Příklad triggeru Stored Procedures & Database Triggers create or replace trigger new_student before insert on student for each row declare default_login STUDENT.LOGIN%TYPE; begin if :new.id is null then :new.id := student_id.nextval; end if; if :new.login is null then :new.login := dbms_random.string( x,8); elsif length(trim(:new.login))!= 8 then raise_application_error(-20000, Login has to have 8 characters! ); end if; end; Marek Rychlý Stored Procedures & Database Triggers, Demo-cvičení pro IDS, 9. dubna 12 / 2014 18
Oracle Reports Stored Procedures & Database Triggers Tvorba tiskových sestav Spuštění tiskových sestav Oracle Reports umožňují jednoduchou tvorbu tiskových sestav. (s výstupem do HTML nebo přímo na tiskárnu, tj. Canvas/PS/PDF) Data pro sestavu z tzv. datového modelu. (definuje query a navazující group bloky, souhrny, atd.) Dotaz může být v rámci datového bloku parametrizovaný. (parametry jako proměnné prostředí se pak zadávají při volání sestavy) Výsledná sestava vypíše data z modelu pak podle šablony. (Web & Paper Layout šablony pro sestavy) Marek Rychlý Stored Procedures & Database Triggers, Demo-cvičení pro IDS, 9. dubna 14 / 2014 18
Tvorba tiskových sestav Spuštění tiskových sestav Tvorba sestav pomocí Report Wizard 1 V reportu zvolit menu Tools / Report Wizard. 2 Vybrat vhodný Layout a Style. (papírový/web layout a styl dle zobrazovaných dat, např. výpis se seskupováním) 3 Zvolit jako zdroj dat SQL Query a zadat SQL dotaz. (v dotazu možno použít parametry jako proměnné prostředí, tj. uvozené : ) 4 Vybrat sloupec výsledku, podle kterého se bude seskupovat. (vhodné pro layouts se seskupováním, např. Grou Left layout) 5 Vybrat sloupce výsledku, které se zobrazí v sestavě. 6 Vybrat sloupec výsledku, kde se budou aplikovat agregační fce. (např. pro celkový počet záznamů, max/min hodnoty, atp.) 7 Zvolit nadpisy datových polí a šablonu vizualizace. 8 Uložit report pom. menu File / Save as jako *.rdf. (původní formát, lépe odlišitelný než novější *.jsp) Marek Rychlý Stored Procedures & Database Triggers, Demo-cvičení pro IDS, 9. dubna 15 / 2014 18
Spuštění tiskové sestavy Tvorba tiskových sestav Spuštění tiskových sestav V Oracle pomocí menu Program / Run Web/Paper Layout. (pokud dotaz s parametry, tak vyzve k jejich zadání) Z Oracle Forms pomocí PL/SQL kódu více video-tutoriál (pomocí RUN_REPORT_OBJECT & WEB.SHOW_DOCUMENT built-ins) DECLARE v_report_id Report_Object; vc_report_job_id VARCHAR2(100); vc_rep_status VARCHAR2(100); BEGIN v_report_id := find_report_object( myreportmodule ); SET_REPORT_OBJECT_PROPERTY(v_report_id, REPORT_OTHER, myparam= :mylocalvar); vc_report_job_id := RUN_REPORT_OBJECT(v_report_id); vc_rep_status := REPORT_OBJECT_STATUS(vc_report_job_id); IF vc_rep_status = FINISHED THEN web.show_document( /<virtual path>/<servlet name>/getjobid= vc_report_job_id?server= <ReportServerTnsName>, _blank ); ELSE message ( Report failed with error message vc_rep_status); END IF; END; Marek Rychlý Stored Procedures & Database Triggers, Demo-cvičení pro IDS, 9. dubna 16 / 2014 18
pro práci s daty na straně databáze. Triggery pro akce před/po/místo modifikace dat. Oracle Reports pro tvorbu tiskových sestav. Dokumentace: Oracle8i Concepts R8.1.5, Procedures and Packages Oracle Database PL/SQL Language Reference 11gR2, PL/SQL Triggers Oracle Reports Documentation nápověda v Oracle Forms/Reports Developer... a další na webových stránkách předmětu Marek Rychlý Stored Procedures & Database Triggers, Demo-cvičení pro IDS, 9. dubna 18 / 2014 18