Bazy danych programowanie Wykład dla studentów matematyk

Podobne dokumenty
Plan bazy: Kod zakładający bazę danych: DROP TABLE noclegi CASCADE; CREATE TABLE noclegi( id_noclegu SERIAL NOT NULL,

Wyzwalacz - procedura wyzwalana, składowana fizycznie w bazie, uruchamiana automatycznie po nastąpieniu określonego w definicji zdarzenia

DECLARE <nazwa_zmiennej> typ [(<rozmiar> )] [ NOT NULL ] [ { := DEFAULT } <wartość> ];

PODSTAWY BAZ DANYCH 13. PL/SQL

DECLARE VARIABLE zmienna1 typ danych; BEGIN

Składowane procedury i funkcje

Hurtownia Świętego Mikołaja projekt bazy danych

E.14 Bazy Danych cz. 18 SQL Funkcje, procedury składowane i wyzwalacze

BAZA DANYCH SIECI HOTELI

Wykład 5 funkcje i procedury pamiętane widoki (perspektywy) wyzwalacze

Bazy danych wykład dwunasty PL/SQL, c.d. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, wykładwarszawa)

Bloki anonimowe w PL/SQL

Procedury wyzwalane. (c) Instytut Informatyki Politechniki Poznańskiej 1

15. Funkcje i procedury składowane PL/SQL

Cele. Definiowanie wyzwalaczy

Blaski i cienie wyzwalaczy w relacyjnych bazach danych. Mgr inż. Andrzej Ptasznik

Przykład 3 Zdefiniuj w bazie danych hurtownia_nazwisko przykładową funkcję użytkownika fn_rok;

Używany kiedy pełna treść instrukcji SQL jest nieznana przed uruchomieniem programu.

w PL/SQL bloki nazwane to: funkcje, procedury, pakiety, wyzwalacze

Programowanie w SQL procedury i funkcje. UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika

Wyzwalacze (triggery) Przykład

Wyzwalacze. Anna Fiedorowicz Bazy danych 2

Język SQL, zajęcia nr 1

Bazy danych wykład szósty Więzy i wyzwalacze. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, wykładwarszawa)

Plan wykładu Projekt fizyczny bazy danych Wprowadzenie PL/SQL PL/SQL Cechy PL/SQL

Wyzwalacze. do automatycznego generowania wartości kluczy głównych. Składnia instrukcji tworzacej wyzwalacz

Systemy GIS Tworzenie zapytań w bazach danych

SQL 4 Structured Query Lenguage

Pakiety podprogramów Dynamiczny SQL

Aspekty aktywne baz danych

Język PL/SQL Procedury i funkcje składowane

SQL :: Data Definition Language

Zaawansowane bazy danych i hurtownie danych semestr I

Administracja i programowanie pod Microsoft SQL Server 2000

Październik Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska. Systemy baz danych - wykład III. dr inż.

Cheatsheet PL/SQL Andrzej Klusiewicz 1/9

Funkcje w PL/SQL Funkcja to nazwany blok języka PL/SQL. Jest przechowywana w bazie i musi zwracać wynik. Z reguły, funkcji utworzonych w PL/SQL-u

Oracle PL/SQL. Paweł Rajba.

KOLEKCJE - to typy masowe,zawierające pewną liczbę jednorodnych elementów

Wykład 8. SQL praca z tabelami 5

Bazy danych. Wykład IV SQL - wprowadzenie. Copyrights by Arkadiusz Rzucidło 1

Monika Sychla Daniel Smolarek Projekt bazy danych

Oracle PL/SQL. Paweł Rajba.

Trigger jest obiektem związanym z tablicą, który aktywuje się gdy do tablicy następuje odpowiednie zapytanie.

Bazy danych Język SQL część 2 Wykład dla studentów matem

Laboratorium nr 4. Temat: SQL część II. Polecenia DML

I. Język manipulowania danymi - DML (Data Manipulation Language). Polecenia INSERT, UPDATE, DELETE

PL/SQL. Zaawansowane tematy PL/SQL

Bazy danych 6. Klucze obce. P. F. Góra

Język PL/SQL. Rozdział 5. Pakiety podprogramów. Dynamiczny SQL

Bazy danych. Bazy danych. Podstawy języka SQL. Dr inż. Paweł Kasprowski.

Tabele wykorzystywane w przykładach

Literatura: SQL Ćwiczenia praktyczne Autor: Marcin Lis Wydawnictwo: Helion. Autor: Joanna Karwowska

Instrukcja podwaja zarobki osób, których imiona zaczynają się P i dalsze litery alfabetu zakładamy, że takich osbób jest kilkanaście.

1. Wyzwalacze BD (ang. triggers)

W PostgreSQL mamy do dyspozycji nie tylko funkcje wbudowane, ale również możemy tworzyć własne. Są one zapisywane w tabeli systemowej pg_proc.

PL/SQL. Zaawansowane tematy PL/SQL. Piotr Medoń

Pakiety są logicznymi zbiorami obiektów takich jak podprogramy, typy, zmienne, kursory, wyjątki.

Relacyjne bazy danych. Podstawy SQL

D D L S Q L. Co to jest DDL SQL i jakie s jego ą podstawowe polecenia?

Procedury i funkcje składowane

PRZESTRZENNE BAZY DANYCH WYKŁAD 2

Bazy danych 7. SQL podstawy

Materiały. Technologie baz danych. Plan wykładu Kursory. Wykład 5: Kursory jawne. Podprogramy. Kursory jawne. Kursory niejawne

SQL Server i T-SQL w mgnieniu oka : opanuj język zapytań w 10 minut dziennie / Ben Forta. Gliwice, Spis treści

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

3 Przygotowali: mgr inż. Barbara Łukawska, mgr inż. Maciej Lasota

Bazy danych Język SQL część 1 Wykład dla studentów matem

Bartosz Jachnik - Kino

Projekt-bazy danych Poczta

Wykład V. Indeksy. Struktura indeksu składa się z rekordów o dwóch polach

Programowanie po stronie serwera w SZBD. Robert A. Kłopotek Wydział Matematyczno-Przyrodniczy. Szkoła Nauk Ścisłych, UKSW

Wykład 5. SQL praca z tabelami 2

CREATE TABLE autorzy ( id_autora SERIAL PRIMARY KEY, imie TEXT, nazwisko TEXT );

Ćwiczenia 2 IBM DB2 Data Studio

BAZY DANYCH Cz III. Transakcje, Triggery

1: 2: 3: 4: 5: 6: 7: 8: 9: 10:

Administracja i programowanie pod Microsoft SQL Server 2000

Komunikacja z bazą danych psql

Projektowanie systemów baz danych

Plan wykładu BAZY DANYCH II WYKŁAD 3. Zasięg zmiennych. Zasięg zmiennych

Bazy Danych i Usługi Sieciowe

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych

Procedury składowane. Funkcje vs. procedury Funkcja. Procedura. zazwyczaj ma parametry tylko typu IN; można wywoływać z poziomu

Relacyjne bazy danych. Podstawy SQL

Bazy danych. Dr inż. Paweł Kasprowski

1 Kursory 1. 2 Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków...

Bazy danych 11. SQL Procedury składowane, kursory i wyzwalacze

Oracle PL/SQL. Paweł Rajba.

Bazy danych 10. SQL Widoki

ORACLE (Wykład 1) aragorn.pb.bialystok.pl/~aonisko. Typy rozproszonych baz danych. Systemy klient-serwer. Klient-serwer: Przykład

Odnawialne Źródła Energii I rok. Tutorial PostgreSQL

Wykład 05 Bazy danych

Oracle PL/SQL. Paweł Rajba.

Bazy danych i usługi sieciowe

Struktura bazy danych

P o d s t a w y j ę z y k a S Q L

Imię i Nazwisko Data Ocena. Laboratorium 7

Transkrypt:

Bazy danych programowanie Wykład dla studentów matematyki 23 kwietnia 2017

Funkcje Funkcje definiuje się w Postgresie używajac konstrukcji CREATE FUNCTION nazwa(parametr typ,...) RETURNS typ-wyniku AS $$ treść-funkcji $$ LANGUAGE nazwa-języka; Treść funkcji dla języka SQL to ciag poleceń SQL. Treść funkcji w starszych wersjach Postgresa otaczało się apostrofami, było to jednak niewygodne, bo wymagało dublowania wszystkich apostrofów wewnatrz treści.

Funkcje Ponieważ w Postgresie polecenia SELECT można używać do obliczania wyrażeń nie zwiazanych z baza danych, np. bd> SELECT 2 + 5 AS siedem; siedem ------ 7 więc najprostsze funkcje można definiować w SQL: CREATE FUNCTION dodaj7(i int4) RETURNS int4 AS $$ SELECT i + 7; $$ LANGUAGE sql;

Funkcje Przykład wywołania takiej funkcji: bd> SELECT dodaj7(4) AS wynik; wynik ----- 11

Funkcje Funkcje napisane w SQL zwracaja jako wartość wynik ostatniego polecenia w treści, musi to być SELECT. Jeśli wynik nie ma być zbiorem, będzie to pierwszy wiersz z tego zapytania (warto więc zadbać o ewentualne ORDER BY ;-). Jeśli wynik zapytania był pusty, to jest zwracane NULL.

Funkcje Dla funkcji SQL, która nie zwraca nic rozsadnego, typem wyniku powinno być void, nie może ona wtedy kończyć się zapytaniem SELECT. CREATE FUNCTION oczyść () RETURNS void AS $$ DELETE FROM Zwierzaki WHERE waga <= 0; $$ LANGUAGE SQL; SELECT oczyść();

PL/pgSQL Normalnie jednak procedury bazy danych definiuje się nie w SQL, lecz w językach proceduralnych. Takim językiem dla serwera bazy danych w Postgresie jest najczęściej PL/pgSQL, zbliżony do PL/SQL z Oracle. Standardowe języki z dystrybucji instaluje się skryptem powłoki systemu createlang. Aby zainstalować PL/pgSQL w bazie danych template1 wystarczy napisać createlang plpgsql template1 Do usuwania języka proceduralnego służy polecenia SQL DROP LANGUAGE albo skrypt droplang.

PL/pgSQL PL/pgSQL (Procedural Language/postgresSQL) rozszerza SQL o typowe konstrukcje spotykane w proceduralnych jezykach imperatywnych. Podstawowa jednostka w PL/SQL jest blok, programy buduje się z zagnieżdżonych bloków. W blokach wolno używać instrukcji SQL służacych do manipulowania danymi (np. SELECT, INSERT, UPDATE, DELETE) oraz instrukcji sterowania transakcjami. Dla instrukcji SELECT jest używana postać rozszerzona, pozwalajaca umieszczać wyszukane wartości w zmiennych PL/pgSQL. Instrukcje definiowania danych schematu, takie jak CREATE, DROP czy ALTER, nie sa dozwolone.

PL/pgSQL Poza tym w blokach można używać typowych instrukcji takich jak przypisanie, instrukcja warunkowa, pętle, wywołania procedur. Bloki PL/pgSQL umieszcza się w treści funkcji, które można uruchamiać zwykła instrukcja SELECT na przykład z poziomu programu psql.

Bloki Blok jest podstawowa konstrukcja języka PL/pgSQL. Składnia bloku: [DECLARE deklaracje zmiennych, stałych i procedur lokalnych>] BEGIN instrukcje END; (nawiasy kwadratowe oznaczaja część opcjonalna, nie sa elementem składni.)

Bloki Przykład bloku: DECLARE a NUMERIC(5); BEGIN SELECT COUNT(*) INTO a FROM EMP WHERE ENAME LIKE A% ; IF a > 0 THEN INSERT INTO TEMP VALUES(a); END IF; RAISE NOTICE OK ; END;

Wyzwalacze Wyzwalacze sa to procedury wykonywane przy zajściu pewnego zdarzenia, np. wstawieniu nowego wiersza do określonej tabeli. Wyzwalacze nie miały służyć do zapewnienia legalności stanów bazy (od tego sa warunki integralności i asercje), lecz do zapewnienia legalności przejść między stanami. Ponieważ jednak większość DBMS nie implementuje asercji (nie jest to zreszta łatwe), wyzwalaczy najczęściej używa się do realizacji złożonych ograniczeń

Wyzwalacze Definicja wyzwalacza obejmuje trzy składowe Zdarzenie: modyfikacja pewnej tabeli, np. wstawienie do tabeli Gatunki. Warunek: wyrażenie Booleowskie w SQL. Akcje: polecenia do wykonania, najczęsciej zapisywane w SQL lub PL/SQL.

Składnia Składnia wyzwalacza napisanego w SQL zgodnie ze standardem: CREATE [OR REPLACE] TRIGGER nazwa {BEFORE AFTER} INSERT OR DELETE OR UPDATE ON tabela FOR EACH {ROW STATEMENT} BEGIN polecenie... END;

Przykład Spróbujmy napisać wyzwalacz, który przy usunięciu wiersza z tabeli Gatunki w odpowiadajacych mu wierszach w tabeli Zwierzaki ustawi NULL w kolumnie gatunek. Oczywiście to samo można osiagn ac łatwiej używajac więzów klucza obcego spróbujmy jednak innego sposobu.

Przykład CREATE TRIGGER DelGat AFTER DELETE ON Gatunki FOR EACH ROW EXECUTE UPDATE Zwierzaki SET gatunek = NULL WHERE gatunek = OLD.nazwa;

Inny przykład Załóżmy, że dla każdego gatunku w tabeli Gatunki chcemy (w osobnej kolumnie) przechowywać liczbę zwierzaków tego gatunku. Zacznijmy od dodania odpowiedniej kolumny ALTER Gatunki ADD ile INTEGER DEFAULT 0 CHECK (ile >= 0);

Inny przykład Pora na wyzwalacze CREATE TRIGGER InsZwierz AFTER INSERT ON Zwierzaki FOR EACH ROW EXECUTE UPDATE Gatunki SET ile = ile + 1 WHERE nazwa = NEW.gatunek; CREATE TRIGGER DelZwierz AFTER DELETE ON Zwierzaki FOR EACH ROW EXECUTE UPDATE Gatunki SET ile = ile - 1 WHERE nazwa = OLD.gatunek;

Wyzwalacze w Postgresie Wyzwalacze w PL/pgSQL definiuje się używajac uprzednio zdefiniowanych procedur bezargumentowych funkcji zwracajacych specjalny typ TRIGGER Funkcja wyzwalacza otrzymuje dane za pośrednictwem struktury TriggerData, a nie przez zwykłe parametry funkcyjne. Procedur tych nie należy wywoływać bezpośrednio. Sa one wywoływane niejawnie przez wyzwalacz, ilekroć wystapi zdarzenie z nim zwiazane. Zdarzeniem może być próba wykonania jednej z operacji SQL INSERT, DELETE lub UPDATE.

Wyzwalacze w Postgresie Dla wyzwalaczy określa się, czy ich procedury maja być wołane przed czy po właściwej operacji (BEFORE lub AFTER). Ponadto dla wyzwalacza określony jest jeden z dwóch poziomów: wiersza lub polecenia (zdania). Opcja FOR EACH ROW deklaruje wyzwalacz poziomu wiersza, domyślnie wyzwalacz jest poziomu polecenia. Wyzwalacz poziomu polecenia jest odpalany tylko raz dla całego polecenia SQL, natomiast wyzwalacz poziomu wiersza jest odpalany niezależnie dla każdego modyfikowanego wiersza.

Wyzwalacze w Postgresie Deklaracja wyzwalacza w PL/pgSQL ma następujac a składnię: CREATE TRIGGER nazwa BEFORE AFTER INSERT DELETE UPDATE [OR...] ON tabela [FOR EACH ROW STATEMENT] EXECUTE PROCEDURE nazwa-procedury(argumenty);

Wyzwalacze w Postgresie Dodatkowe uwagi: Funkcja wyzwalacza musi zostać zdefiniowana przed utworzeniem wyzwalacza. Nazwa wyzwalacza musi być unikalna dla danej tabeli i przydaje się przy usuwaniu wyzwalacza. Można określić do trzech rodzajów zdarzeń (INSERT, DELETE lub UPDATE) uruchamiajacych wyzwalacz używajac spójnika OR. Przykłady:... INSERT ON R...... INSERT OR DELETE OR UPDATE ON R...

Wyzwalacze w Postgresie Usuwajac wyzwalacz trzeba oprócz jego nazwy podać nazwę tabeli DROP TRIGGER nazwa ON tabela; W treści funkcji zwiazanej z wyzwalaczem poziomu wiersza sa dostępne dwie zmienne rekordowe NEW i OLD, odnoszace się do nowej i starej zawartości wiersza. Procedura wyzwalacza dla wstawiania i modyfikacji powinna zwracać odpowiedni rekord, zwykle jest to po prostu NEW. Można też zwracać NULL, co w wyzwalaczach typu BEFORE oznacza, że wykonanie wyzwalacza nie powiodło się i operacja powinna zostać zignorowana.

Wyzwalacze w Postgresie Wyzwalacze tego samego typu uruchamia się w kolejności alfabetycznej według ich nazw. Jeśli w funkcji wyzwalacza używa się poleceń modyfikacji danych SQL, moga one spowodować uruchomienie innych wyzwalaczy, nazywa się to kaskadowaniem wyzwalaczy. Nie istnieje żadne ograniczenie na liczbę poziomów wywołań kaskadowych, w szczególności możliwe sa wywołania rekurencyjne. Programista jest odpowiedzialny za unikanie nieskończonej rekursji.

Wyzwalacze w Postgresie Pora na przykłady. Załóżmy, że mamy tabelę CREATE TABLE Gatunki ( nazwa VARCHAR(30) PRIMARY KEY, kontynent VARCHAR(11), chroniony BOOLEAN, przysmak VARCHAR(15) );

Wyzwalacze w Postgresie Utworzymy wyzwalacz dbajacy, aby nazwa kontynentu rozpoczynała się duża litera: CREATE FUNCTION normkont () RETURNS TRIGGER AS $$ BEGIN IF NEW.kontynent IS NOT NULL THEN NEW.kontynent := lower(new.kontynent); NEW.kontynent := initcap(new.kontynent); END IF; RETURN NEW; END; $$ LANGUAGE plpgsql ; CREATE TRIGGER gatwyzw1 BEFORE INSERT OR UPDATE ON Gatunki FOR EACH ROW EXECUTE PROCEDURE normkont();

Wyzwalacze w Postgresie Wykonanie polecenia CREATE TRIGGER jedynie tworzy wyzwalacz nie wykonujac go. Aby uruchomić wyzwalacz należy spowodować zajście odpowiedniego zdarzenia, w tym przypadku wstawienia lub modyfikacji wiersza dla tabeli Gatunki. UPDATE Gatunki SET kontynent= afryka WHERE nazwa= kura ;

Programowanie aplikacji Dostęp użytkowy do baz danych odbywa się zwykle przez programy, uruchamiane na stacji roboczej użytkownika. Programy takie można pisać w dowolnym języku programowania, musi on jednak być wyposażony w interfejs programisty dla SQL (tzw. API Application Programmer Interface). Interfejs może być specyficzny dla danego systemu DBMS lub uniwersalny (np. ODBC, JDBC).

Interfejs dla języka C Autorzy systemów DBMS prawie zawsze dostarczaja interfejs dla języka C. Standard SQL określa taki typ interfejsu CLI czyli Call-Level Interface (interfejs poziomu wywołań) Obejrzymy podstawowy interfejs systemu PostgreSQL dla języka C, zawarty w bibliotece libpq. W programie należy dołaczyć odpowiedni plik nagłówkowy: #include "libpq-fe.h"

Interfejs dla języka C Korzystanie w programie z bazy danych wymaga nawiazania połaczenia: PGConn *polaczenie; polaczenie = PQconnectdb("dbname=bd,host=labdb,user=ja"); if (PQstatus(polaczenie) == CONNECTION_BAD) fprintf(stderr, "Brak polaczenia\n"); PQfinish(polaczenie); exit(1); Załóżmy, że połaczenie powiodło się i w bazie danych znajduje się tabela Gatunki, zawierajaca m.in. kolumny nazwa i kontynent.

Interfejs dla języka C Chcemy wyszukać z tej tabeli, z jakiego kontynentu pochodzi gatunek o podanej nazwie (np. wczytanej z klawiatury). PGresult *wynik; wynik = PQexec(polaczenie, "SELECT kontynent FROM Gatunki " "WHERE nazwa = szop pracz "); if (PQresultStatus(wynik) == PGRES_TUPLES_OK && PQntuples(wynik) == 1) printf("szop pracz pochodzi z %s\n", PQgetvalue(wynik, 0, 0)); else fprintf(stderr, "Brak odpowiedzi\n"); PQfinish(polaczenie);

Zanurzony (embedded) SQL Embedded SQL jest to technika bezpośredniego wpisywania poleceń SQL jako instrukcji języka zanurzajacego, w tym przypadku języka C. W PostgreSQL służy do tego narzędzie o nazwie ECPG. Przy zanurzaniu SQL w inne języki programowania występuje szereg problemów, najważniejsze to Inne typy danych w SQL niż w języku zanurzajacym konieczna jest konwersja SQL jest zorientowany na operowanie zbiorami wartości, a nie pojedynczymi wartościami rozwiazanie to używanie kursorów.

Zanurzony (embedded) SQL Program w C z wbudowanymi poleceniami SQL jest najpierw przetwarzany preprocesorem ecpg na program w języku C. Preprocesor rozpoznaje polecenia SQL zawarte w programie i zastępuje je wywołaniami funkcji z biblioteki CLI dla SQL. Otrzymany program przetwarza się normalnym kompilatorem C na program wykonywalny. ecpg -I/usr/include/ecpg test1.pgc cc -I/usr/include/ecpg -o test1 test1.c -lecpg

Zanurzony SQL Wszystkie polecenia SQL musza być poprzedzane fraza EXEC SQL i kończyć się średnikiem ( ; ). Można je umieszczać gdziekolwiek w programie w C pilnujac jedynie, aby deklaracje poprzedzały polecenia wykonywalne. Przykład: int main () { EXEC SQL BEGIN DECLARE SECTION; int w; EXEC SQL END DECLARE SECTION;... EXEC SQL SELECT wiek INTO :w FROM Zwierzaki WHERE imie= Kropka ;... printf("kropka waży %d kilo\n", w);... }