Zsbd PL/SQL część 3

Post on 09-Jan-2016

43 views 1 download

description

Zsbd PL/SQL część 3. Wykład 5 Prowadzący: dr Paweł Drozda. Program wykładu. Pakiety Wyzwalacze. Pakiety. Obiekt logiczny schematu bazy danych grupujący logicznie powiązane elementy PL/SQL – typy, zmienne, podprogramy (procedury, funkcje) Skład pakietu: Specyfikacja Zawartość/ciało - PowerPoint PPT Presentation

Transcript of Zsbd PL/SQL część 3

ZSBDPL/SQL CZĘŚĆ 3

Wykład 5

Prowadzący: dr Paweł Drozda

Program wykładu

dr P. Drozda

Pakiety Wyzwalacze

Pakiety

dr P. Drozda

Obiekt logiczny schematu bazy danych grupujący logicznie powiązane elementy PL/SQL – typy, zmienne, podprogramy (procedury, funkcje)

Skład pakietu: Specyfikacja Zawartość/ciało

Specyfikacja zawiera deklaracje typów, zmiennych, stałych, kursorów podprogramów, do których można się odwoływać z zewnątrz pakietu (zadeklarowane elementy są publiczne)

Zawartość zawiera instrukcje dla kursorów i podprogramów zadeklarowanych w specyfikacji oraz może definiować dodatkowe elementy niewidoczne na zewnątrz

Pozwala wiele elementów załadować na raz

Zalety pakietów

dr P. Drozda

Zgrupowane logicznie powiązane elementy w jednym miejscu

Ukrycie informacji Z zewnątrz widoczna specyfikacja Konstrukcje w zawartości niedostępne do wglądu

Kompilacja oddzielnie specyfikacji i zawartości

Trwałość danych publicznych – zmienne, kursory – przez całą sesję użytkownika

Lepsza wydajność – cały pakiet wczytywany jest raz dla wszystkich użytkowników

Przeciążanie procedur, funkcji

Elementy deklaracji pakietów

dr P. Drozda

SpecyfikacjaZmienna;Procedura A deklaracja;Funkcja B deklaracja;… ZawartośćZmienna1;Procedura C deklaracja …Procedura A deklaracja BEGIN…;END;Funkcja B deklaracjaBEGIN…END;

Publiczny

Prywatny

Widoczność elementów w pakietach

dr P. Drozda

Zmienna widoczna wszędzie

Zmienna1 widoczna tylko w obrębie Zawartości

Zmienna2 widoczna tylko w procedurze A

Procedura C widoczna tylko wewnątrz Zawartości – może być wykorzystana w procedurze A i funkcji C

SpecyfikacjaZmienna;Procedura A deklaracja;Funkcja B deklaracja;… ZawartośćZmienna1;Procedura C deklaracja …Procedura A deklaracja BEGINZmienna2;…;END;Funkcja B deklaracjaBEGIN…END;

Tworzenie pakietów – składnia

dr P. Drozda

CREATE [OR REPLACE] PACKAGE nazwa AS|ISdeklaracja typów publicznych;deklaracja zmiennych;specyfikacja podprogramów;

END [nazwa];CREATE [OR REPLACE] PACKAGE BODY nazwa AS|IS

odpowiednie deklaracje, tworzenie zawartości podprogramów;

Zmienne domyślnie inicjowane na NULL Wszystkie elementy zadeklarowane widoczne są

dla użytkowników mających prawa dostępu do pakietu

Przykład – tworzenie pakietu

dr P. Drozda

CREATE OR REPLACE PACKAGE pracownicy ISnumer NUMBER:= 111;CURSOR nazwisko IS SELECT last_name FROM employees;PROCEDURE nazwisko (id number);FUNCTION zarobki (id number) RETURN NUMBER;END pracownicy;

Przykład ciąg dalszy

dr P. Drozda

CREATE PACKAGE BODY Pracownicy IS Jakaszmienna VARCHAR2(2);PROCEDURE nazwisko (id number) IS

name employees.last_name%TYPE;BEGIN SELECT last_name INTO name FROM employees

WHERE employee_id = id;DBMS_OUTPUT.PUT_LINE(last_name);END nazwisko;…END Pracownicy;

Przykład pakietu bez zawartości

dr P. Drozda

CREATE PACKAGE stale ISkm2mile CONSTANT NUMBER := 1.6093;mile2km CONSTANT NUMBER := 0.6214;jard2metr CONSTANT NUMBER := 0.9144;metr2jard CONSTANT NUMBER := 1.0936;

END stale;CREATE OR REPLACE FUNCTION zamiana(km

NUMBER) RETURN NUMBER ISBEGIN

RETURN (km*stale.km2mile);END;

Wywołanie elementów pakietu

dr P. Drozda

Z linii komend EXECUTE nazwapakietu.nazwaElementu; EXECUTE Pracownicy.nazwisko(100);

Gdy ze schematu innego użytkownika EXECUTE HR.Pracownicy.nazwisko(100);

Wewnątrz bloku Tak samo jak wywołanie normalne

elementów – tylko poprzedzone nazwą pakietu do którego należą; gdy pakiet z innego schematu – dodatkowo na początku nazwa schematu

Przeglądanie, usuwanie pakietów

dr P. Drozda

Informacje o pakietach znajdują się w user_source SELECT text FROM user_source WHERE

type=‘PACKAGE’ | ‘PACKAGE BODY’; DROP PACKAGE nazwa; DROP PACKAGE BODY nazwa;

Reguły tworzenia pakietów

dr P. Drozda

Specyfikacja pakietu tworzona przed zawartością

Odwołanie w podprogramie do innego elementu (np. w procedurze do funkcji) możliwe tylko, gdy ta funkcja została wcześniej zadeklarowana (jeśli publiczna – nie ma problemu, jeśli prywatna trzeba pilnować)

Umieszczanie w specyfikacji tylko niezbędnych elementów (widocznych dla wszystkich)

Przeciążanie podprogramów

dr P. Drozda

Możliwość zadeklarowania procedury/funkcji z tą samą nazwą więcej niż raz

Konieczność rozróżnienia za pomocą parametrów (ich liczby, rodzin typów lub kolejności)

Możliwość nadpisania lokalnych podprogramów, z pakietu

Nie można przeciążać: Gdy parametry są w tej samej rodzinie typów

(np. NUMBER i DECIMAL) Gdy są podtypami tej samej rodziny (VARCHAR

i STRING są podtypami VARCHAR2) Gdy funkcje różnią się tylko zwracanym typem

Przykład przeciążania

dr P. Drozda

CREATE OR REPLACE PACKAGE dept ISPROCEDURE add_dept(id NUMBER, name

VARCHAR2 :=‘edu’, location VARCHAR);PROCEDURE add_dept(name VARCHAR2);END dept;

Pakiet wbudowany STANDARD

dr P. Drozda

Zawiera najczęściej wykorzystywane funkcje (np. ROUND, TO_CHAR, NVL, LENGTH, etc.)

Funkcje wywoływane bez konieczności poprzedzania nazwą pakietu

Gdy jakaś funkcja zostanie przeciążona – konieczność odwołania poprzez nazwę pakietu

Blok inicjalizacyjny pakietu

dr P. Drozda

Na koniec zawartości można dodać blok wykonywany raz

Uruchomiany raz w momencie ładowania pakietu do sesji użytkownika

Służy do dokładniejszej inicjalizacji elementów pakietu Przykład:CREATE PACKAGE inic ISkasa NUMBER;…CREATE PACKAGE BODY inic IS…BEGINSELECT salary INTO kasa FROM employees WHERE employee_id

=120;END inic;

Wyzwalacze

dr P. Drozda

Bloki składowane w bazie, które są uruchomiane w momencie wystąpienia jakiegoś zdarzenia

Wyzwalacze definiowane są na perspektywie, tabeli, schemacie użytkownika bądź na całej bazie

Możliwości uruchomienia wyzwalacza: Wystąpienie DML (INSERT, UPDATE, DELETE) Wystąpienie DDL (CREATE, ALTER, DROP) Wystąpienie operacji na bazie danych takich jak

SERVERERROR, LOGON, LOGOFF, SHUTDOWN, STURTUP

Wyzwalacze dla DML

dr P. Drozda

Możliwe instrukcje wywołujące wyzwalacz: INSERT UPDATE [OF kolumna] DELETE

Może być więcej niż jedna instrukcja INSERT OR DELETE INSERT OR UPDATE OR DELETE

Zawartość wyzwalacza określa jakie akcje zostaną podjęte w momencie użycia wyzwalacza (może być blokiem, odwołaniem do procedur)

Tworzenie wyzwalacza – składnia

dr P. Drozda

CREATE TRIGGER nazwaBEFORE | AFTER | INSTEAD OFINSERT | UPDATE | DELETE

ON nazwaObiektu[REFERENCING OLD AS old /NEW AS new]

[FOR EACH ROWWHEN (condition)][DECLARE] BEGIN

…END;

Wyzwalacz przykład

dr P. Drozda

CREATE OR REPLACE TRIGGER godziny BEFORE INSERT ON employees BEGIN

IF (TO_CHAR(SYSDATE,'DY') IN ('SAT','SUN')) OR (TO_CHAR(SYSDATE,'HH24:MI') NOT BETWEEN '08:00' AND '18:00') THEN

RAISE_APPLICATION_ERROR(-20500,‘nie można nic wstawić przecież nie pracujesz');

END IF;END;

Odpalenie wyzwalacza raz/wiele

dr P. Drozda

Gdy zapytanie operuje na jednym wierszu – trigger odpalany raz (obojętnie czy z opcją każdego wiersza czy bez opcji) np.INSERT INTO departments(department_id) VALUES (3);

Gdy zapytanie dotyczy wielu wierszy – z opcją FOR EACH ROW wyzwalacz odpalany wiele razy, bez opcji – tylko razUPDATE employees SET salary=salary*1.2 WHERE department_id=50;

Przykład – różne instrukcje DML

dr P. Drozda

CREATE TRIGGER godziny BEFORE INSERT OR UPDATE OR DELETE ON employees BEGINIF (TO_CHAR(SYSDATE,'DY') IN ('SAT','SUN')) OR (TO_CHAR(SYSDATE,'HH24:MI') NOT BETWEEN '08:00' AND '18:00')

THENIF INSERTING THEN

RAISE_APPLICATION_ERROR(-20500,‘nic nie wstawic');ELSE IF DELETING THEN

RAISE_APPLICATION_ERROR(-20502,‘nie wyrzucaj');ELSEIF UPDATING THEN

RAISE_APPLICATION_ERROR(-20503,‘zostalo zmodyfikowane wczoraj’);END IF;

END IF;END;

Wyzwalacz wierszowy - przykład

dr P. Drozda

CREATE TRIGGER widelkiBEFORE INSERT OR UPDATE OF salaryON employeesFOR EACH ROW BEGINIF NOT (:NEW.job_id IN (‘AD_PRES’,’AD_VP’))

AND :NEW.SALARY >15000 THENRAISE APPLICATION_ERROR(-20202, ‘za dużo

chcesz zarabiać’);END;

Przykład z opcją WHEN

dr P. Drozda

CREATE TRIGGER zarobkiBEFORE INSERT OR UPDATE OF salaryON employeesFOR EACH ROW WHEN (NEW.job_id = ‘SA_REP’)BEGINIF INSERTING THEN :NEW.commission_pct := 0;ELSEIF :OLD.commission_pct

THEN :NEW.commission_pct := 0;ELSE

:NEW.commission_pct :=:OLD.commission_pct +0.05;

END;