340 likes | 490 Views
Zsbd PL/SQL część 2. Wykład 4 Prowadzący: dr Paweł Drozda. Program wykładu. Wyjątki Procedury Funkcje. Kontrola wyjątków. Wyjątki – Błędy pojawiające się podczas uruchomienia bloku
E N D
ZsbdPL/SQL część 2 Wykład 4 Prowadzący: dr Paweł Drozda
Program wykładu • Wyjątki • Procedury • Funkcje dr P. Drozda
Kontrola wyjątków • Wyjątki – Błędy pojawiające się podczas uruchomienia bloku • W momencie wystąpienia wyjątku blok kończy działanie – wyjątek pozawala na wykonanie ostatnich działań przed końcem wykonania bloku • Większość języków programowania zapewnia kontrolę wyjątków • Dwie opcje wywołania wyjątku: • predefiniowane w Oracle (np. NO_DATA_FOUND) • wywoływane przez użytkownika za pomocą RAISE nazwa, gdzie nazwa zdefiniowana jako wyjątek z dodaną obsługą dr P. Drozda
Przykład wprowadzający DECLARE name VARCHAR2(20); BEGIN SELECT last_name INTO name FROM employees WHERE department_id = 50; END; - zwraca błąd – więcej wierszy niż oczekiwano dr P. Drozda
Obsługa wyjątku przykład DECLARE name VARCHAR2(20); BEGIN SELECT last_name INTO name FROM employees WHERE department_id = 50; dbms_output.put_line(name); EXCEPTION WHEN TOO_MANY_ROWS THEN dbms_output.put_line(‘Zmień warunek WHERE tak aby zwracał 1 wiersz’); END; dr P. Drozda
Typy wyjątków dr P. Drozda
Tworzenie obsługi – sekcja EXCEPTION BEGIN … EXCEPTION WHEN wyjatek1 [OR wyjatek2 …] THEN instrukcje; … WHEN wyjatek3 [OR wyjatek4…] THEN instrukcje WHEN OTHERS THEN instrukcje; END; dr P. Drozda
Przykład deklaracji obsługi wyjątków EXCEPTION WHEN NO_DATA_FOUND THEN dbms_output.put_line(‘poszukaj lepiej’); WHEN TOO_MANY_ROWS THEN dbms_output.put_line(‘za dobrze szukasz’); WHEN OTHERS THEN dbms_output.put_line(‘nie wiem co ale cos nie dziala’); dr P. Drozda
Predefiniowane wyjątki w Oracle dr P. Drozda
Tworzenie nie predefiniowanych wyjątków dla błędów serwera • Proces tworzenia obsługi Sekcja DECLARE Sekcja EXCEPTION DECLARE ASSOCIATE HANDLE • Deklaracja zmiennej typu EXCEPTION • Przypisanie do zmiennej kodu błędu • PRAGMA EXCEPTION_INIT(zmienna,kodbłędu) • 3. Zdefiniowanie obsługi błędu dla zadeklarowanej zmiennej dr P. Drozda
Przykład – definicja obsługi błędu • Definicja dla błędu przy wstawianiu NULL DECLARE wyjatek EXCEPTION; PRAGMA EXCEPTION_INIT(wyjatek, -01400); BEGIN INSERT INTO departments(department_id, department_name) VALUES(270, NULL); EXCEPTION WHEN wyjatek THEN DBMS_OUTPUT.PUT_LINE('ten blad to:'); DBMS_OUTPUT.PUT_LINE(SQLERRM); DBMS_OUTPUT.PUT_LINE(SQLCODE); END; dr P. Drozda
Funkcja z wyłapywaniem wyjątków • Jak gromadzić wyjątki które nie są zdefiniowane? EXCEPTION … WHEN OTHERS THEN blad_numer := SQLCODE; info_blad := SQLERRM; INSERT INTO bledy(uzytkownik, data, blad, tresc) VALUES (USER, SYSDATE, blad_numer,info_blad); end; dr P. Drozda
Wyjątki użytkownika • Proces tworzenia obsługi Sekcja główna Sekcja EXCEPTION Sekcja DECLARE DECLARE RAISE HANDLE • Deklaracja zmiennej typu EXCEPTION • Wywołanie wyjątku w wyniku instrukcji RAISE • 3. Zdefiniowanie obsługi błędu dla zadeklarowanej zmiennej dr P. Drozda
Przykład wyjątku użytkownika DECLARE deptnum NUMBER:=300; name varchar2(20):=‘nie wstawi’; wyjatek EXCEPTION; BEGIN UPDATE departments SET department_name = name WHERE department_id = deptnum; IF SQL%NOTFOUND THEN RAISE wyjatek; END IF; … EXCEPTION WHEN wyjatek THEN dbms_output.put_line(‘nie ma takiego numeru’); END; dr P. Drozda
Bloki nazwane • Dwa typy: • Procedury • Funkcje • Możliwość przechowywania w systemie baz danych • Możliwość wielokrotnego wykorzystywania w wielu miejscach i przez różnych użytkowników • Odwołanie przez nazwę (najczęściej z parametrami) • Wyodrębnienie mniejszych zadań tworzących logiczną całość • Łatwiejsze wychwycenie błędów, łatwiejsze zmiany dr P. Drozda
Nazwane a nienazwane bloki dr P. Drozda
Procedury a funkcje dr P. Drozda
Procedury • Składnia tworzenia: CREATE [OR REPLACE] PROCEDURE nazwa(parametr tryb typ_danych [DEFAULT wartość], …) AS|IS deklaracja zmiennych lokalnych; BEGIN instrukcje; … END; • tryb może przyjmować wartości : IN – parametry wejściowe (ustawiane domyślnie) OUT – parametry wyjściowe IN OUT – parametry działające w obie strony DEFAULT – w przypadku nie podania parametru, przyjmowana wartość dr P. Drozda
Przykłady CREATE PROCEDURE nic IS BEGIN NULL; END; CREATE PROCEDURE nazwisko (ident IN NUMBER DEFAULT 111) IS nameemployees.last_name%TYPE; BEGIN SELECT last_name INTO name FROM employees WHERE employee_id = ident; dbms_output.put_line(name); END; dr P. Drozda
Wywołanie procedury • W bloku PL/SQL • jako nazwa procedury, wraz z parametrami • Z linii komend • EXECUTE nazwa_procedury(parametry) • Przykład a) BEGIN nic; END; b) EXECUTE nazwisko(123) dr P. Drozda
Przekazywanie parametrów IN, OUT CREATE PROCEDURE znajdz(id IN NUMBER, zarobki OUT NUMBER) IS BEGIN SELECT salary INTO zarobki FROM employees WHERE employee_id=id; END; CREATE PROCEDURE wyswietl IS zarobki employees.salary%TYPE; BEGIN znajdz(123, zarobki); dbms_output.put_line(zarobki); znajdz(201, zarobki); dbms_output.put_line(zarobki); END; dr P. Drozda
Użycie parametru IN OUT CREATE PROCEDURE dodaj48 (telefon IN OUT varchar2) IS BEGIN telefon := ‘+48’ || telefon; END; wywołanie procedury DECLARE tel varchar2(20):=‘997’; BEGIN dodaj48(tel); dbms_output.put_line(tel); END; dr P. Drozda
Okno konsoli – zmienne • Deklaracja • VARIABLE nazwa typ • odwołanie w procedurze • nazwaProcedury(:nazwaZmiennej) • wypisanie na ekran • PRINT nazwaZmiennej • Przykład VARIABLE zarobki NUMBER znajdz(134,:zarobki) PRINT zarobki dr P. Drozda
Możliwości przekazywania parametrów • W ustalonym porządku – normalnie • nazwisko(111) • Poprzez nazwy • nazwisko(ident=>111) • Mieszane • dodaj_job(‘IT_DBA’, ’admin’,min_salary => 6000, max_salary => 20000) • UWAGA do mieszanych • parametry porządkowe muszą poprzedzać parametry podawane poprzez nazwy – inaczej błąd dr P. Drozda
Przekazywanie parametrów cd. • Stosowanie wartości DEFAULT • procedura może być wywołana bez parametrów przyjmowane wartości domyślne • gdy nie ma wartości domyślnych odpowiednie parametry muszą być podane • Przykład dodaj_job; dodaj_job(‘IT_DBA’,’superadmin’); dodaj_job(job_title=>’superhiperadmin’); dr P. Drozda
Obsługa wyjątków w procedurach • Deklaracja tak jak w blokach anonimowych • Gdy wyjątek obsługiwany – tylko wywołanie procedury zwracające wyjątek nie zakończy się sukcesem – pozostałe tak • Gdy wyjątek nieobsługiwany – w momencie pojawienia się wyjątku cały program kończy działanie – nic po wyjątku nie jest wykonywane dr P. Drozda
Przykład CREATE OR REPLACE PROCEDURE wstaw (jid varchar2, title varchar2) IS BEGIN INSERT INTO jobs(job_id, job_title) VALUES(jid,title); EXCEPTION WHEN OTHERS THEN dbms_output.put_line('zlyidik'); END; BEGIN wstaw(‘it_dba’, ‘superadmin’); wstaw(‘it_dba’,’superhiperadmin’); END; Dzięki tej części pierwszy wstaw zostanie wykonany. jeśli by nie było obsługi wyjątków – nic by się nie dodało dr P. Drozda
Funkcje • Składnia CREATE [OR REPLACE] FUNCTION nazwa (parametr typ_danych, …) RETURN typ_danych IS zmienne lokalne; BEGIN … RETURN wartość zgodna z typem; … END; dr P. Drozda
Przykład funkcji CREATE OR REPLACE FUNCTION maksik (a NUMBER, b NUMBER) RETURN NUMBER IS BEGIN IF a>b THEN RETURN a; ELSE return b; END IF; END maksik; dr P. Drozda
Przekazywanie parametrów • w określonym porządku, poprzez odwołanie do nazwy, mieszane – tak jak przy procedurach • możliwość wykorzystania wartości domyślnej DEFAULT • Ograniczenia na parametry mieszane – tak jak w procedurach dr P. Drozda
Jak wywołać funkcję • Linia komend • EXECUTE dbms_output.put_line(maksik(20,30)) • VARIABLE wieksza NUMBER EXECUTE :wieksza:=maksik(100,200) • Blok anonimowy • DECLARE wieksza NUMBER; BEGIN wieksza:=maksik(30,50); END; • Instrukcja SQL • SELECT job_id, maksik(min_salary, max_salary) FROM jobs; dr P. Drozda
Używanie funkcji w instrukcjach SQL • Mogą być stosowane jak jednowierszowe funkcje wbudowane • na liście kolumn w SELECT • W warunkach WHERE i HAVING • W grupowaniu i porządkowaniu (GROUP BY, ORDER BY) • W INSERT w miejscu VALUES • W UPDATE po SET dr P. Drozda
Ograniczenia na użycie w SQL • Zawierają tylko parametry w trybie IN • parametry są zwykłych typów SQL • zwracana wartość musi być typu SQL – nie PL/SQL • Funkcja musi być przechowywana w bazie • Użytkownik wykonujący musi mieć przywilej EXECUTE FUNCTION • Nie mogą zawierać COMMIT, ROLLBACK • Przy SELECT nie mogą zawierać DML • Przy UPDATE i DELETE nie mogą wykonywać instrukcji DML na tej samej tabeli dr P. Drozda