PROJEKT: [ FIRMA TURYSTYCZNA

Wielkość: px
Rozpocząć pokaz od strony:

Download "PROJEKT: [ FIRMA TURYSTYCZNA"

Transkrypt

1 2011/12 PODSTAWY BAZ DANYCH PROJEKT: [ FIRMA TURYSTYCZNA ] PIOTR BRYK, BARTŁOMIEJ SZCZEPANIK

2 Spis treści Spis treści... 1 Opis i cel projektu... 3 Opis tworzonego systemu... 4 Założenia poczynione przy tworzeniu systemu... 4 Funkcje realizowane przez system... 4 Struktura bazy danych... 5 Schemat bazy danych... 5 Styl stworzonego kodu SQL... 6 Opis schematu... 7 Tabele stałe i słownikowe... 7 Autoinkrementacja kluczy głównych... 8 Warunki integralności danych Ograniczenia Wyzwalacze Procedury wykowywane okresowo Generacja danych testowych Dane testowe i ich podział Generator danych Moduł DML dla bazy Oracle 11g Moduł generujący dane tabeli COUNTRY Moduł generujący pojedynczego użytkownika i adres Moduł generujący klientów Moduł prostego mapowania O/R Moduł generujący kompletne wycieczki Struktura widoków Informacje dla organizatorów wycieczki i przewoźników Analiza klientów firmy Zarządzanie rezerwacjami Zarządzanie wycieczkami i atrakcjami Informacje potrzebne do wystawienia faktury Zestaw operacji na danych Struktura indeksów Indeksy na kluczach głównych Opis i cel projektu Projekt Firma turystyczna P. Bryk, B. Szczepanik

3 Własne indeksy Struktura uprawnień do danych Administrator Manager / Szef Sprzedawca / system sprzedaży Strona internetowa firmy Dodatkowe informacje Projekt Firma turystyczna P. Bryk, B. Szczepanik Opis i cel projektu 2

4 Opis i cel projektu Projekt ma na celu stworzenie kompletnego systemu zarządzania sprzedażą wycieczek. W całym projekcie operujemy następującymi słowami kluczowymi: 1. Wycieczka (trip) impreza, w której udział organizuje nasza firma 2. Atrakcja (attraction) niewliczone w cenę atrakcje dostępne podczas imprezy 3. Rezerwacja (reservation) rezerwacja wycieczki lub jej wykupienie 4. Klient (client) osoba rezerwująca / wykupująca wycieczkę 5. Uczestnik (reservation person) osoba biorąca udział w imprezie Projekt został stworzony przy użyciu serwera bazy danych Oracle 11g, a także narzędzi Oracle SQL Developer i Oracle SQL Data Modeler. 3 Opis i cel projektu Projekt Firma turystyczna P. Bryk, B. Szczepanik

5 Opis tworzonego systemu Założenia poczynione przy tworzeniu systemu 1. Miejscem wyjazdu/pobytu mogą być różne kraje 2. Liczba miejsc na każdą wycieczkę jest ograniczona 3. Z każdą imprezą mogą być związane pewne usługi/atrakcje dodatkowe 4. Liczba miejsc na usługi/atrakcje dodatkowe jest ograniczona 5. Klientami mogą być osoby indywidualne lub firmy 6. Klient ma możliwość dokonania rezerwacji 7. Rezerwacja jest bezpłatna i jest ważna przez 14 dni 8. Rezerwacje mogą być złożone tylko do określonego dla każdej wycieczki terminu 9. Klient może poinformować organizatora, że nie pojedzie mimo wykupionej rezerwacji 10. Cena wycieczek i atrakcji może ulegać zmianie w trakcie okresu rezerwacji. 11. Klient zachowuje ceny wycieczki i atrakcji z dnia rezerwacji 12. Klient ma możliwość wykupienia imprezy, co obydwa się przez złożenie rezerwacji i uiszczeniu opłaty 13. Wykupiona rezerwacja nie może ulec zmianie, można złożyć nową rezerwację 14. Klient ma możliwość rezerwacji i/lub wykupienia usługi/atrakcji dodatkowych pod warunkiem, że rezerwuje/wykupuje imprezę główną 15. Klient ma możliwość zapłaty w kilku transzach 16. Płatność może odbywać się gotówką lub przelewem 17. Za wykupione imprezy/usługi klient otrzymuje fakturę 18. Klient podaje uczestników wycieczki i poszczególnych atrakcji Funkcje realizowane przez system 1. Dodawanie i modyfikacja wycieczek i atrakcji 2. Dodawanie i modyfikowanie rezerwacji i rezerwacji atrakcji 3. Dodawanie i usuwanie osób przyporządkowanych do rezerwacji 4. Dodawanie i modyfikacja klientów 5. Dodawanie, modyfikacja i usuwanie płatności 6. Wyświetlanie danych do faktury 7. Wyświetlanie danych do analizy klientów 8. Wyświetlanie danych do analizy rezerwacji 9. Wyświetlanie danych do analizy wycieczek i atrakcji 10. Wyświetlenie listy uczestników wycieczki i poszczególnych atrakcji Projekt Firma turystyczna P. Bryk, B. Szczepanik Opis tworzonego systemu 4

6 Struktura bazy danych Schemat bazy danych 5 Struktura bazy danych Projekt Firma turystyczna P. Bryk, B. Szczepanik

7 Cały schemat w jednym pliku typu PNG dostępny na stronie: Styl stworzonego kodu SQL Tworząc naszą bazę danych staraliśmy się postępować zgodnie z ogólnie przyjętymi zasadami programowania w języku SQL. Dążyliśmy także do tego, aby baza była jak najbardziej spójna, a dostęp do niej był łatwy i intuicyjny. Tak więc zdefiniowaliśmy zestaw wytycznych dotyczących stylu kodu i nazewnictwa: 1. Nazwy wszystkich bytów (zmiennych, procedur, wyzwalaczy, itp.) są pisane albo z samych wielkich liter albo samych małych. Kolejne wyrazy są oddzielane podkreśleniami (tzw. underscore case). Przykłady poprawnych nazw: GET_DATE, get_date. Przykłady niepoprawnych nazw: getdate, GETDATE. Projekt Firma turystyczna P. Bryk, B. Szczepanik Struktura bazy danych 6

8 2. Nazwy tabel są zapisane w liczbie pojedynczej, chyba że liczba pojedyncza jest zastrzeżonym słowem kluczowym SQL. Przykład poprawnej nazwy tabeli: CLIENT, DATES (date jest słowem kluczowym). Nieprawidłowe nazwy: CLIENTS, RESERVATIONS. 3. Linie w kodzie nie powinny przekraczać 130 znaków. Opis schematu W schemacie bazy danych można wyróżnić dwie części. Pierwsza składa się z tzw. tabel stałych i słownikowych. Zostaną one opisane w następnym paragrafie. Druga część to tabele, na których użytkownik będzie przeprowadzał operacje. Oto ich lista wraz z krótkim opisem: 1. CLIENT klienci firmy turystycznej. Klient może być osobą prywatną lub firmą. Wymaganymi polami są nazwa, , telefon oraz wartość logiczna wskazująca czy jest to firma. 2. RESERVATION rezerwacje na wycieczki. Każda rezerwacja jest na określoną wycieczkę i nie może być dodana po upłynięciu czasu określonego w wycieczce. W rezerwacji znajdują się dane do faktury. Zdecydowaliśmy się na takie rozwiązanie, ponieważ często zdarza się, że klient podczas różnych zamówień chce faktury na różne firmy, tak więc trzymanie tych danych w tabeli CLIENT byłoby błędem projektowym. Ponadto, w rezerwacji trzymana jest cena, która obowiązywała podczas jej składania. Pozwala to zmieniać ceny wycieczek (np. oferty last minute) bez ingerencji w trwające rezerwacje. Jednakże w każdej chwili można uaktualnić cenę zapisaną w rezerwacji na tą, która znajduje się w tabeli TRIP. Rekordy z tej tabeli nie powinny być usuwane. Zamiast tego należy zmienić status rezerwacji na jeden z dostępnych. 3. TRIP impreza/wycieczka organizowana przez biuro turystyczne. Posiada liczbę, która wskazuje ile maksymalnie osób może brać w niej udział, a także aktualną cenę. Jest identyfikowana przez nazwę i długi opis. Ponadto po minięciu określonej daty nie można składać już rezerwacji nią. Wycieczki nie powinny być usuwane z tej tabeli, lecz wycofywane poprzez użycie procedury RETIRE_TRIP (opisana w następnych rozdziałach). 4. ATTRACTION atrakcja związana z daną wycieczką (TRIP). Każda atrakcja jest osobnym bytem i może być związana tylko z jedną wycieczką. Tak samo jak impreza, ma ograniczenie ilości wolnych miejsc i aktualną cenę. Posiada także nazwę i opis. 5. RESERVATION_PERSON dane personalne (imię i nazwisko) osoby w danej rezerwacji. W trakcie składania rezerwacji klient nie musi od razu podawać danych osób biorących udział w wycieczce. Może to zrobić w dowolnym momencie trwania rezerwacji. 6. RESERVED_ATTRACTION atrakcja dla danej rezerwacji. Zawiera ilość miejsc jak i cenę atrakcji obowiązującą podczas składania (można ją uaktualnić w każdej chwili) 7. RESERVED_ATTRACTION_DETAILS powiązanie osoby z danej rezerwacji z wybraną atrakcją. Atrakcja musi należeć do rezerwacji, z której pochodzi osoba. Tabele stałe i słownikowe Część tabel zawiera dane, które w większości przypadków nie będą się zmieniać przez cały czas eksploatacji bazy danych. Wprowadziliśmy te tabele, żeby nie musieć trzymać wartości w kodzie (tzw. magic numbers). Ponadto, dzięki temu zabiegowi otrzymujemy automatycznie integralność danych. Przykładem będzie zastosowanie tabeli PAYMENT_TYPE, w której znajdują się dwie wartości: Przelew bankowy i Płatność bezpośrednia wraz z ich kluczami głównymi. Teraz typem płatności może być tylko jedna z tych dwóch wartości. Gdybyśmy nie mieli jednak tabeli PAYMENT_TYPE, to 7 Struktura bazy danych Projekt Firma turystyczna P. Bryk, B. Szczepanik

9 użytkownik dla przykładu, mógłby dodać płatność typu abc, która kompletnie nie ma sensu. Żeby temu zapobiec musielibyśmy stosować wyzwalacze, a w naszym przypadku integralność danych (która jest bardzo ważna) otrzymujemy niejako przy okazji. Lista stałych tabel wraz z ich wartościami: PAYMENT_TYPE typy płatności insert into payment_type values ('1', 'Przelew bankowy'); insert into payment_type values ('2', 'Patność bezporśednia'); COUNTRY wszystkie kraje świata insert into country values ( 'AF', 'Afghanistan' ); insert into country values ( 'AX', 'Aland Islands' ); insert into country values ( 'AL', 'Albania' ); insert into country values ( 'DZ', 'Algeria' ); insert into country values ( 'AS', 'American Samoa' ); insert into country values ( 'AD', 'Andorra' ); insert into country values ( 'AO', 'Angola' ); insert into country values ( 'AI', 'Anguilla' ); insert into country values ( 'AQ', 'Antarctica' ); insert into country values ( 'AG', 'Antigua and Barbuda' ); insert into country values ( 'UY', 'Uruguay' ); insert into country values ( 'UZ', 'Uzbekistan' ); insert into country values ( 'VU', 'Vanuatu' ); insert into country values ( 'VE', 'Venezuela' ); insert into country values ( 'VN', 'Viet Nam' ); insert into country values ( 'VG', 'Virgin Islands, British' ); insert into country values ( 'VI', 'Virgin Islands, U.S.' ); insert into country values ( 'WF', 'Wallis and Futuna' ); insert into country values ( 'EH', 'Western Sahara' ); insert into country values ( 'YE', 'Yemen' ); insert into country values ( 'ZM', 'Zambia' ); insert into country values ( 'ZW', 'Zimbabwe' ); RESERVATION_STATE statusy rezerwacji insert into reservation_state values ( '1', 'Zapłacona' ); insert into reservation_state values ( '2', 'Zapłacona częściowo' ); insert into reservation_state values ( '3', 'Trwająca nadal' ); insert into reservation_state values ( '4', 'Anulowana' ); insert into reservation_state values ( '5', 'Czas oczekiwania minął' ); Autoinkrementacja kluczy głównych W celu uproszczenia modyfikacji danych do tabel, które będą modyfikowane przez użytkownika dodaliśmy opcję autoinkrementacji kluczy głównych. Dzięki temu nie trzeba podawać wartości klucza podczas wstawiania danych do tabeli, jednak, gdy użytkownik chce, to może ją podać. Obie sytuacje są przez nas wspierane. Jedynym warunkiem jest to, żeby klucz główny podany przez użytkownika był mniejszy niż Autoinkrementacja została zaimplementowana przy użyciu wyzwalaczy i sekwencji dla tabel: Projekt Firma turystyczna P. Bryk, B. Szczepanik Struktura bazy danych 8

10 PAYMENT RESERVATION TRIP ATTRACTION CLIENT RESERVATION_PERSON --PAYMENT_ID autoincrement create sequence seq_payment_id start with increment by 1 nomaxvalue; create or replace trigger autoincrement_payment before insert on payment for each row begin if :new.payment_id is null then select seq_payment_id.nextval into :new.payment_id from dual; end autoincrement_payment; / ---RESERVATION_ID autoincrement create sequence seq_reservation_id start with increment by 1 nomaxvalue; create or replace trigger autoincrement_reservation before insert on reservation for each row begin if :new.reservation_id is null then select seq_reservation_id.nextval into :new.reservation_id from dual; end autoincrement_reservation; / ---TRIP_ID autoincrement create sequence seq_trip_id start with increment by 1 nomaxvalue; create or replace trigger autoincrement_trip before insert on trip for each row begin if :new.trip_id is null then select seq_trip_id.nextval into :new.trip_id from dual; end autoincrement_trip; / ---ATTRACTION_ID autoincrement create sequence seq_attraction_id start with increment by 1 nomaxvalue; create or replace trigger autoincrement_attraction before insert on attraction for each row begin if :new.attraction_id is null then select seq_attraction_id.nextval into :new.attraction_id from dual; end autoincrement_attraction; / 9 Struktura bazy danych Projekt Firma turystyczna P. Bryk, B. Szczepanik

11 ---CLIENT_ID autoincrement create sequence seq_client_id start with increment by 1 nomaxvalue; create or replace trigger autoincrement_client before insert on client for each row begin if :new.client_id is null then select seq_client_id.nextval into :new.client_id from dual; end autoincrement_client; / ---RESERVATION_PERSON_ID autoincrement create sequence seq_reservation_p_id start with increment by 1 nomaxvalue; create or replace trigger autoincrement_reservation_p before insert on reservation_person for each row begin if :new.reservation_person_id is null then select seq_reservation_p_id.nextval into :new.reservation_person_id from dual; end autoincrement_reservation_p; / Projekt Firma turystyczna P. Bryk, B. Szczepanik Struktura bazy danych 10

12 Warunki integralności danych Ograniczenia Warunki integralności danych są zachowane przy użyciu dwóch technik: wyzwalaczy (triggers) i ograniczeń (constraints). Gdzie tylko to możliwe staraliśmy się korzystać z ograniczeń na poziomie tabel. Pozwalają one w łatwy sposób sprawdzić proste warunki integralności danych. Przy ich użyciu sprawdzaliśmy czy podane kwoty pieniężne mają realne wartości (są nieujemne) i liczby rezerwowanych osób są dodatnie. Przykładowe ograniczenia: ALTER TABLE attraction ADD CONSTRAINT positive_number_of_places_in_a CHECK (number_of_places > 0) INITIALLY IMMEDIATE ENABLE VALIDATE ; ALTER TABLE attraction ADD CONSTRAINT non_negative_a_price CHECK (current_price_per_person >= 0 ) INITIALLY IMMEDIATE ENABLE VALIDATE ; ALTER TABLE client ADD CONSTRAINT boolean_good CHECK (is_company in(1, 0) ) INITIALLY IMMEDIATE ENABLE VALIDATE ; ALTER TABLE payment ADD CONSTRAINT payment_is_positive CHECK (amount > 0 and amount is not null) INITIALLY IMMEDIATE ENABLE VALIDATE ; ALTER TABLE reservation ADD CONSTRAINT positive_number_of_people CHECK (number_of_people > 0) INITIALLY IMMEDIATE ENABLE VALIDATE ; ALTER TABLE reservation ADD CONSTRAINT non_negative_reservation_price CHECK (price_per_person >= 0) INITIALLY IMMEDIATE ENABLE VALIDATE ; ALTER TABLE reservation ADD CONSTRAINT invoice CHECK ((issue_invoice = 1 and invoice_city is not null and invoice_postal_code is not null and invoice_street_address is not null and invoice_company_name is not null) or (issue_invoice = 0) 11 Warunki integralności danych Projekt Firma turystyczna P. Bryk, B. Szczepanik

13 ) ; INITIALLY IMMEDIATE ENABLE VALIDATE Wyzwalacze Wyzwalacze to potężne narzędzie, które pozwoliło nam stworzyć skomplikowane warunki integralności zawierające nietrywialną logikę biznesową. Pierwszy z nich, ON_PERSON_ADDED, pozwala nam sprawdzić czy liczba dodanych osób do rezerwacji nie przekracza zadeklarowanej liczby. create or replace trigger on_person_added before insert on reservation_person for each row declare missing integer; actual number; begin select missing_people into missing from reservation_people where reservation_id = :new.reservation_id; if missing = 0 then raise_application_error (-20000,'Cannot insert more people than reserved!'); end on_person_added; Drugi wyzwalacz jest uruchamiany podczas dodawania konkretnej osoby do atrakcji. Sprawdzamy tutaj czy dana atrakcja należy do rezerwacji, z której pochodzi osoba i czy nie przekroczono liczby dostępnych miejsc na atrakcję. create or replace trigger on_person_to_attraction_added before insert on reserved_attraction_details for each row declare max_number number; actual number; foreign_id number; begin select reservation_id into foreign_id from reservation_person where reservation_person_id = :new.reservation_person_id; if :new.reservation_id!= foreign_id then raise_application_error (-20000,'Cannot associate the person with this attraction, because it belongs to the other reservation!'); select number_of_people into max_number from reserved_attraction where reserved_attraction.reservation_id = :new.reservation_id and reserved_attraction.attraction_id = :new.attraction_id; select count(*) into actual from reserved_attraction_details where reserved_attraction_details.reservation_id = :new.reservation_id and reserved_attraction_details.attraction_id = :new.attraction_id; if actual >= max_number then raise_application_error (-20000,'Cannot insert more people than reserved!'); end on_person_to_attraction_added; Projekt Firma turystyczna P. Bryk, B. Szczepanik Warunki integralności danych 12

14 Niestety, system zarządzania bazą danych Oracle nie pozwala w niektórych wyzwalaczach pobierać wartości z aktualnie zmienianej tabeli. Wobec tego postanowiliśmy, że pozostałe warunki integralności zostaną zachowane poprzez zaoferowanie użytkownikowi wachlarza procedur modyfikacji danych. Dzięki temu integralność zostanie zachowana, mimo ograniczeń samej bazy danych. Zdajemy sobie także sprawę z faktu, że wybrane przez nas rozwiązanie jest mniej bezpieczne od korzystania z samych wyzwalaczy, ponieważ użytkownik może ominąć nasze procedury i samemu zacząć modyfikować wrażliwe dane. Jednakże, gdybyśmy wdrażali naszą bazę danych w systemie produkcyjnym, wtedy prawdopodobnie mielibyśmy uprawnienia administratora. Moglibyśmy wtedy zablokować dostęp do samodzielnego dostępu do danych, a więc zmusić użytkownika do używania naszych procedur. Procedury zostały szerzej opisane w rozdziale Zestaw operacji na danych. Oto lista warunków integralności, które dzięki nimi osiągnęliśmy: Nie można dodać płatności do przedawnionej lub anulowanej rezerwacji Status rezerwacji zostaje automatycznie zaktualizowany po przyjściu wpłaty Usunięcie płatności powoduje aktualizacje statusu rezerwacji Nie można dodać rezerwacji po terminie ustalonym w wycieczce Nie można zarezerwować zbyt dużo miejsc na wycieczkę Data złożenia rezerwacji jest datą jej pojawienia się w systemie Można modyfikować ceny tylko trwających rezerwacji Można zmienić liczbę zarezerwowanych miejsc tylko w trwającej rezerwacji Nie można zmienić liczby zarezerwowanych miejsc na wycieczkę na liczbę mniejszą niż już podana ilość osób z imienia i nazwiska Nie można zarezerwować zbyt dużej ilości miejsc na atrakcję Nie można dodać osoby do atrakcji z innej rezerwacji Nie można zmienić liczby zarezerwowanych miejsc na atrakcję na liczbę mniejszą niż już podana ilość osób z imienia i nazwiska Procedury wykowywane okresowo Ponieważ rezerwacje mogą trwać tylko określoną ilość czasu, stworzyliśmy procedurę, która automatycznie zmienia ich status po upływie określonej ilości dni. Powinna być ona uruchamiana automatycznie co np. jeden dzień, jednak nie mamy uprawnień pozwalających nam to zrealizować. Korzystamy tutaj z pomocniczej funkcji GET_RESERVATION_DURATION, która zostanie opisana później. create or replace procedure expire_reservations is begin update reservation set reservation_state_id = 5 where start_datecurrent_date > get_reservation_duration and reservation_state_id = 3; expired end expire_reservations; 13 Warunki integralności danych Projekt Firma turystyczna P. Bryk, B. Szczepanik

15 Generacja danych testowych Dane testowe i ich podział Następnym etapem projektowania bazy danych było wypełnienie stworzonej uprzednio struktury danymi. Oczywiście nie mógł być to proces całkowicie losowy. Dane muszą spełniać wszystkie założenia integralności. Wydzieliliśmy dwa typy danych. Pierwszy z nich to dane, które praktycznie nie zmieniają się w trakcie działania programu. Należą do nich przede wszystkim dane tabel słownikowych RESERVATION_STATE i PAYMENT_TYPE, ale także dane tabeli COUNTRY. Zawarte zostały one wszystkie razem w pliku fixed.sql. Pozostałe dane będą się zmieniać w trakcie programu. Wprowadziliśmy tu kolejny podział. W pierwszej kolejności wygenerowaliśmy listę klientów naszej firmy, a następnie kompletny zestaw wycieczek, rezerwacji i atrakcji. Generator danych Do zestawów danych napisaliśmy własny generator, by mieć większą kontrolę nad otrzymanymi danymi. Generator został napisany w języku Python. Wybór padł na ten język, dlatego że jest on bardzo prostym w użyciu językiem skryptowym i posiada rozbudowaną bibliotekę standardową z najważniejszą dla nas klasą random. Klasa ta zawiera metody randint(), sample(), choice(), uniform(), które bardzo ułatwiają tworzenie niedeterministycznych programów. Generator złożony jest z kilku modułów. Jedne z nich generują pojedyncze wartości lub obiekty, kolejne korzystają z poprzednich do generowania zestawów danych. Dodatkowo istnieje moduł odwzorowujący bardzo uproszczony DML bazy danych Oracle 11g i moduł implementujące bardzo proste odwzorowanie obiektowo-relacyjne. Każdy z tych modułów zostanie opisany oddzielnie. Moduł DML dla bazy Oracle 11g Moduł oracle_script ma za zadanie ułatwić pozostałym skryptom generacje skryptu SQL. Zawiera metodę insert_statement przyjmującą jako argumenty nazwę tabeli i tablicę wartości. Wartości mogą być przekazane w dowolnym typie, moduł sam skonwertuje je do postaci łańcucha znakowego. W dodatku zapewni też poprawny zapis znaków nieprzyjmowanych przez bazę Oracle w postaci jawnej i zapis daty w odpowiednim formacie. Moduł też odciąża nas z obsługi plików. import datetime class oracle_script(object): ''' Oracle DML script helper ''' def escape_oracle_string(self, ostr): ostr = ostr.replace('\'', '\'\'') ostr = ostr.replace('\"', '\\\'') return ostr def init (self): pass def sopen(self, filepath): self.scriptfile = open(filepath, 'w') Projekt Firma turystyczna P. Bryk, B. Szczepanik Generacja danych testowych 14

16 def sclose(self): self.scriptfile.flush() self.scriptfile.close() def add_empty_lines(self): self.scriptfile.write('\n\n\n') def add_insert_statement(self, table_name, values): text_values = '' for value in values: if value == None: text_values += 'NULL, ' elif isinstance(value, datetime.date): text_values += 'to_date(\'{0}\',\'yyyy/mm/dd\'), '.format(self. escape_oracle_string(str(value.strftime("%y/%m/%d")))) else: text_values += '\'{0}\', '.format(self. escape_oracle_string(str(value))) text_values = text_values.rstrip(', ') self.scriptfile.write('insert into {0} values ( {1} ); \n'.format(table_name, text_values)) oracle_script.py Moduł generujący dane tabeli COUNTRY Wymieniony skrypt tworzy listę krajów w formacie DML tak, by znalazła się w tabeli COUNTRY. Lista państw i ich oficjalnych kodów znajduje się w pliku tekstowym o następującym formacie: AD:Andorra AO:Angola AI:Anguilla code-countries.txt Skrypt DML zapisywany jest do pliku sql/country.sql. Treść tego pliku zostanie dołączona do fixed.sql. from oracle_script import oracle_script if name == ' main ': finput = open('lists/country-codes.txt') script = oracle_script() script.sopen('sql/country.sql') for line in finput: country_code, country_name = line.strip().split(':') script.add_insert_statement('country', [country_code, country_name]) finput.close() script.sclose() generate_countries.py Moduł generujący pojedynczego użytkownika i adres Ta część generatora odpowiedzialna jest za stworzenie pojedynczej krotki zawierające dane osobowe. Na podstawie listy imion, nazwisk i domen generuje imię, nazwisko i adres osoby. Poza tym generowany jest jeszcze numer telefonu. Generator tworzy dane osobowe 15 Generacja danych testowych Projekt Firma turystyczna P. Bryk, B. Szczepanik

17 charakterystyczne dla Polaków. Dane zwracane są za pomocą metody next_person(). Inna klasa odpowiedzialna jest za wylosowanie adresu z podanej przez plik puli. from random import choice, randint ''' Generates person ''' class person_generator(object): def init (self): file1 = open('lists/names.txt', 'r') file2 = open('lists/surnames.txt', 'r') domainsfile = open('lists/domains.txt', 'r') self.first = [] self.last = [] self.domains = [] for line in file1: self.first.append(line.strip().capitalize()) for line in file2: self.last.append(line.strip().capitalize()) for line in domainsfile: self.domains.append(line.strip().lower()) file1.close() file2.close() domainsfile.close() def fix_non_ascii_letters(self, string): foo = string.replace('ł', 'l'); foo = foo.replace('ł', 'l'); foo = foo.replace('ś', 's'); foo = foo.replace('ś', 's'); foo = foo.replace('ę', 'e'); foo = foo.replace('ę', 'e'); foo = foo.replace('ż', 'z'); foo = foo.replace('ż', 'z'); foo = foo.replace('ń', 'n'); foo = foo.replace('ń', 'n'); foo = foo.replace('ą', 'a'); foo = foo.replace('ą', 'a'); foo = foo.replace('ó', 'o'); foo = foo.replace('ó', 'o'); return foo def next_person(self): first_name = choice(self.first) last_name = choice(self.last) domain = choice(self.domains) ascii_first_name = self. fix_non_ascii_letters(first_name.lower()) ascii_last_name = self. fix_non_ascii_letters(last_name.lower()) = ascii_first_name + ascii_last_name + '@' + domain.lower() number = randint( , ) return first_name, last_name, , number Projekt Firma turystyczna P. Bryk, B. Szczepanik Generacja danych testowych 16

18 ''' Generates address ''' class address_generator(object): def init (self): file1 = open('lists/addresses.txt', 'r') self.addresses = [] for line in file1: self.addresses.append(line.strip().split(',')) file1.close() def next_address(self): address = choice(self.addresses) return address[0], address[1], address[2] generators.py Moduł generujący klientów W następnej kolejności wygenerowaliśmy listę klientów firmy. Pierwsze sto z nich to wylosowani przy pomocy uprzednio opisanego generatora klienci indywidualni. W następnej kolejności dorzucamy wszystkie firmy zawarte w pliku company.txt. from random import randint from oracle_script import oracle_script from generators import person_generator if name == ' main ': generator = person_generator() script = oracle_script() script.sopen('sql/client.sql') for i in xrange(1, 100): first, last, , number = generator.next_person() script.add_insert_statement('client', [i, first + " " + last, , number, PL, None, None, None, 0]) # loading companies from file finput = open( lists/company.txt ) i = 101 for line in finput: city, postal, street, company_name = line.strip().split(, ) = company_name.lower() + company_name.lower() +.com phone = randint( , ) script.add_insert_statement( client, [i, company_name, , phone, PL, city, postal, street, 1]) i += 1 finput.close() script.sclose() generate_clients.py 17 Generacja danych testowych Projekt Firma turystyczna P. Bryk, B. Szczepanik

19 Moduł prostego mapowania O/R By móc łatwo odwoływać się do tworzonych kaskadowo tabel stworzyliśmy bardzo prosty O/R M. Zdefiniowaliśmy klasę-odpowiednik dla każdej tabeli w bazie, która będzie potrzebna w generatorze wycieczek. Niektóre z nich mają zaimplementowaną sekwencje do ustalenia klucza głównego. Wszystkie też mają pole table_name określającą nazwę odwzorowywanej tabeli i metodę getvalues(), która zwraca listę wartości, które później wstawimy do bazy, w kolejności zgodnej ze schematem bazy. Poza nimi istnieje również klasa DBSet, która zbiera wszystkie krotki, które będziemy chcieli następnie dodać do bazy. Metoda generate_script przyjmuje nazwę pliku, w której zapisze wszystkie dane, które dodajemy metodą insert(). Przed generacją skryptu dane są sortowane po tabelach w takiej kolejności, by dodawanie nie naruszyło warunków integralności (konkretnie foreign key contraint). from oracle_script import oracle_script class Attraction(object): id_sequence = 1 def init (self): self.script_order = 2 self.table_name = 'attraction' self.attraction_id = Attraction.id_sequence Attraction.id_sequence += 1 def getvalues(self): return [self.attraction_id, self.trip_id, self.name, self.current_price_per_person, self.description, self.number_of_places] pass class Reservation(object): id_sequence = 1 def init (self): self.script_order = 3 self.table_name = 'reservation' self.reservation_id = Reservation.id_sequence Reservation.id_sequence += 1 def getvalues(self): return [self.reservation_id, self.trip_id, self.client_id, self.reservation_state_id, self.number_of_people, self.price_per_person, self.start_date, self.issue_invoice, self.city, self.postal_code, self.street_address, self.invoice_receiver] class ReservedAttraction(object): def init (self): self.script_order = 4 self.table_name = 'reserved_attraction' def getvalues(self): return [self.reservation_id, self.attraction_id, self.number_of_people, Projekt Firma turystyczna P. Bryk, B. Szczepanik Generacja danych testowych 18

20 self.price_per_person] class ReservedAttractionDetails(object): def init (self): self.script_order = 6 self.table_name = 'reserved_attraction_details' def getvalues(self): return [self.reservation_id, self.attraction_id, self.reservation_person_id] class ReservationPerson(object): id_sequence = 1 def init (self): self.script_order = 5 self.table_name = 'reservation_person' self.reservation_person_id = ReservationPerson.id_sequence ReservationPerson.id_sequence += 1 def getvalues(self): return [self.reservation_person_id, self.reservation_id, self.first_name, self.last_name] class Payment(object): id_sequence = 1 def init (self): self.script_order = 7 self.table_name = 'payment' self.payment_id = Payment.id_sequence Payment.id_sequence += 1 def getvalues(self): return [self.payment_id, self.reservation_id, self.payment_type_id, self.date, self.amount] class Trip(object): id_sequence = 1 def init (self): self.script_order = 1 self.table_name = 'trip' self.trip_id = Trip.id_sequence Trip.id_sequence += 1 def getvalues(self): return [self.trip_id, self.country_id, self.name, self.description, self.reservation_end_date, self.current_price_per_person, self.number_of_places] class DBSet(object): ''' classdocs ''' def init (self): self.tuples = [] def insert(self, table_tuple): self.tuples.append(table_tuple) 19 Generacja danych testowych Projekt Firma turystyczna P. Bryk, B. Szczepanik

21 pass def generate_script(self, filename): self.tuples.sort(cmp=none, key=lambda t: t.script_order, reverse=false) script = oracle_script() script.sopen(filename) before = 1 for t in self.tuples: if(t.script_order!= before): script.add_empty_lines() script.add_insert_statement(t.table_name, t.getvalues()); before = t.script_order script.sclose() pass simple_orm.py Moduł generujący kompletne wycieczki Istotą modułu jest funkcja generate_trip przyjmującą następujące parametry: 1. Referencja do instancji DBSet 2. Kod kraju, którego ma dotyczyć wycieczka 3. Nazwa wycieczki 4. Opis wycieczki 5. Data końca rezerwacji 6. Ilość miejsc 7. Ilość miejsc, które zostały wykupione przez klientów 8. Ilość atrakcji Jak można się domyślić część danych wprost kopiowana jest do tabeli trip. Dwa ostatnie parametry służą do pokierowania działaniem generatora. Atrakcji już nie tworzymy wprost. Ograniczamy się tylko do podania ich liczby. Ilość miejsc wykupionych posłuży do zatrzymania generacji rezerwacji na określonym poziomie, by nie zawsze otrzymywać w pełni wykupione wycieczki. Dla wygody przy atrakcjach rzecz dzieje się już całkowicie losowo. Algorytm generacji wygląda następująco. Zaczynamy od utworzenia obiektu wycieczki. W przeciwieństwie do odpowiednika w bazie, dla wygody dodaliśmy mu pole free_places. Inicjalizujemy wszystkie pola, losujemy początkową cenę wycieczki. Następnie tworzymy atrakcje do naszej wycieczki. Wybieramy ich tyle ile dostaliśmy w parametrze z jakiejś prostej predefiniowanej listy atrakcji. Określamy jej cenę w przedziale 5-10% ceny całej wycieczki. Tutaj także dla wygody mamy pole free_places. W tym momencie następuje pętla rezerwacji. Będziemy je tworzyć dopóki nie wykorzystamy wszystkich wolnych miejsc (pomniejszonych odpowiednio o przekazany argument). Inicjalizujemy podstawowe pola rezerwacji, przyporządkowujemy jej klienta. Wprowadzamy dla wygody pole cost, które będzie zliczać koszt całej rezerwacji. Liczba osób w rezerwacji jest losowa, ale nie ma rozkładu liniowego, żeby uniknąć bardzo dużych rezerwacji lub bardzo dużej ilości małych rezerwacji. Datę Projekt Firma turystyczna P. Bryk, B. Szczepanik Generacja danych testowych 20

22 rezerwacji ustalamy maksymalnie na 40 dni przed datą końca rezerwacji wycieczki. Po drodze uaktualniamy dane wycieczki w miarę potrzeb. Z 50% prawdopodobieństwem zwiększamy cenę wycieczki (symulujemy rzeczywisty wzrost cen wraz ze zbliżającym się terminem wycieczki). Podobnie wybieramy czy rezerwujący chciał mieć wystawioną fakturę. Jeśli tak to losujemy dane adresowe i osobę, na którą wystawiona jest faktura. Po stworzeniu samej rezerwacji generujemy odpowiednią liczbę uczestników korzystając z modułu generującego osoby. Po tym tworzymy rezerwacje dla każdej atrakcji. Jeśli wylosowana liczba uczestników jest zerowa to pomijamy tworzenie obiektu. Cena atrakcji również zmienia się po każdej rezerwacji, ale są to zmiany dużo mniejsze. Przy okazji pamiętamy o dodaniu kosztu atrakcji do rezerwacji. Natychmiast też przyporządkowujemy uczestników poszczególnych atrakcji, gdy tylko utworzymy dla niej rezerwacje. Ostatnim etapem tworzenia rezerwacji jest stworzenie ewidencji płatności. Możemy mieć płatność w jednej, dwóch lub trzech ratach z prawdopodobieństwem 66%, 17%, 17%. Płatności tworzymy tak, by ich suma faktycznie odpowiadała kosztowi rezerwacji a ich daty znajdowały się pomiędzy datą stworzenia rezerwacji a datą końca rezerwacji dla wycieczki i w dodatku zachowały kolejność. Skrypt korzysta z kilku stałych, które mają kluczowe znaczenie dla jego działania. Musimy podać mu, jakie jest identyfikator stanu zapłaconej rezerwacji oraz zakres identyfikatorów klientów, których wygenerowaliśmy wcześniej. W głównej funkcji skryptu wywołujemy procedurę generującą kompletne zestawy, które łącznie zapisane będą w jednym pliku sql/complete-trips.sql. from random import choice, uniform, sample, randint from simple_orm import * import datetime from generators import address_generator, person_generator attractions = ['basen', 'spa', 'wieża widokowa', 'muzeum', 'spływ kajakowy', 'narty', 'snowboard', 'koncert', 'dyskoteka', 'piwo'] reservation_state_id_paid = 1 person_gen = person_generator() address_gen = address_generator() client_id_range = xrange(1,112) def generate_trip(dbset, trip_country_id, trip_name, trip_description, trip_reservation_end_date, trip_number_of_places, paid_places, attraction_number): global attractions, reservation_state_id_paid, person_gen, client_id_range trip = Trip() trip.country_id = trip_country_id trip.name = trip_name trip.description = trip_description trip.number_of_places = trip_number_of_places trip.reservation_end_date = trip_reservation_end_date trip.free_places = paid_places trip.current_price_per_person = randint(11,13) * choosen_attractions = sample(attractions, attraction_number) trip.attraction_set = [] for i in xrange(0, attraction_number): 21 Generacja danych testowych Projekt Firma turystyczna P. Bryk, B. Szczepanik

23 attraction = Attraction() attraction.trip_id = trip.trip_id attraction.name = choosen_attractions[i] attraction.current_price_per_person = round(trip.current_price_per_person / uniform(10,20)) attraction.description = attraction.name + ' kosztuje ' + str(attraction.current_price_per_person) attraction.number_of_places = max(5, int(trip.number_of_places / uniform(1, 10))) attraction.free_places = attraction.number_of_places dbset.insert(attraction) trip.attraction_set.append(attraction) while trip.free_places > 0: reservation = Reservation() reservation.cost = 0.0 reservation.trip_id = trip.trip_id reservation.client_id = choice(client_id_range) reservation.reservation_state_id = reservation_state_id_paid reservation.number_of_people = randint(1, max(min(5,trip.free_places), (int) (trip.free_places / 2))) trip.free_places -= reservation.number_of_people reservation.price_per_person = trip.current_price_per_person if(randint(0,1) == 1): trip.current_price_per_person -= 50.0 reservation.start_date = trip.reservation_end_date - datetime.timedelta(randint(0,40), 0, 0) if(randint(0,1) == 1): reservation.issue_invoice = 1 city, postal, street = address_gen.next_address() reservation.city = city reservation.postal_code = postal reservation.street_address = street receiver = person_gen.next_person() reservation.invoice_receiver = receiver[0] + ' ' + receiver[1] if(randint(1,5) == 1): reservation.invoice_receiver += ' sp. j.' else: reservation.issue_invoice = 0 reservation.city = None reservation.postal_code = None reservation.street_address = None reservation.invoice_receiver = None reservation.cost = reservation.number_of_people * reservation.price_per_person; reservation.person_set = [] for i in xrange(0, reservation.number_of_people): first, last, , number = person_gen.next_person() reservation_person = ReservationPerson() Projekt Firma turystyczna P. Bryk, B. Szczepanik Generacja danych testowych 22

24 reservation_person.reservation_id = reservation.reservation_id reservation_person.first_name = first reservation_person.last_name = last dbset.insert(reservation_person) reservation.person_set.append(reservation_person) for attr in trip.attraction_set: places = randint(0, min(attr.free_places, reservation.number_of_people)) if(places == 0): continue res_attr = ReservedAttraction() res_attr.attraction_id = attr.attraction_id res_attr.reservation_id = reservation.reservation_id res_attr.number_of_people = places res_attr.price_per_person = attr.current_price_per_person attr.current_price_per_person += 1.0 attr.free_places -= places reservation.cost += res_attr.number_of_people * res_attr.price_per_person dbset.insert(res_attr) people_for_this_attraction = sample(reservation.person_set, res_attr.number_of_people) for person in people_for_this_attraction: res_attr_details = ReservedAttractionDetails() res_attr_details.reservation_id = res_attr.reservation_id res_attr_details.attraction_id = res_attr.attraction_id res_attr_details.reservation_person_id = person.reservation_person_id dbset.insert(res_attr_details) # payments instalments = randint(1, 6) if(instalments > 3): instalments = 1 topay = reservation.cost daysbefore = (trip.reservation_end_date - reservation.start_date).days for i in xrange(0, instalments): payment = Payment() payment.reservation_id = reservation.reservation_id payment.payment_type_id = randint(1,2) daysbefore = randint(0, daysbefore) 23 Generacja danych testowych Projekt Firma turystyczna P. Bryk, B. Szczepanik

25 payment.date = trip.reservation_end_date - datetime.timedelta(daysbefore, 0, 0) if(i!= (instalments - 1)): payment.amount = round(uniform(topay/3.0, topay /1.5), 2) topay -= payment.amount else: payment.amount = topay dbset.insert(payment) dbset.insert(reservation) dbset.insert(trip) pass if name == ' main ': dbset = DBSet() generate_trip(dbset, 'GB', 'Wycieczka do Wielkiej Brytanii', 'musisz tam być!', datetime.date(2011,10,03), 100, 70, 1) generate_trip(dbset, 'LV', 'Wycieczka do Łotwy', 'musisz tam być!', datetime.date(2011,10,25), 100, 90, 2) generate_trip(dbset, 'FR', 'Wycieczka do Francji', 'musisz tam być!', datetime.date(2012,02,29), 100, 92, 3) generate_trip(dbset, 'PL', 'Wycieczka w Bieszczady', 'musisz tam być!', datetime.date(2012,03,13), 20, 20, 2) generate_trip(dbset, 'AU', 'Wycieczka do Australii', 'musisz tam być!', datetime.date(2012,06,05), 50, 40, 6) generate_trip(dbset, 'IT', 'Wycieczka do Włoch', 'musisz tam być!', datetime.date(2012,10,25), 100, 13, 3) generate_trip(dbset, 'US', 'Wycieczka do USA', 'musisz tam być!', datetime.date(2012,12,02), 100, 1, 4) dbset.generate_script('sql/complete-trips.sql') generate_complete_trips.py Projekt Firma turystyczna P. Bryk, B. Szczepanik Generacja danych testowych 24

26 Struktura widoków W ramach projektu stworzyliśmy także widoki ułatwiające dostęp do danych dla użytkowników bazy. Pogrupowaliśmy je na poszczególne przypadki użycia. Informacje dla organizatorów wycieczki i przewoźników Widoki te umożliwiają szybki dostęp do list uczestników poszczególnych wycieczek, a także atrakcji. Lista taka zazwyczaj jest dostarczana przewoźnikowi lub przewodnikowi. 1. LISTING_TRIP_PERSON o TRIP_ID o FIRST_NAME o LAST_NAME 2. LISTING_TRIP_ATTR_PERSON o TRIP_ID o ATTRACTION_ID o FIRST_NAME o LAST_NAME CREATE OR REPLACE FORCE VIEW "LISTING_TRIP_PERSON" ("TRIP_ID", "FIRST_NAME", "LAST_NAME") AS SELECT r.trip_id, rp.first_name, rp.last_name FROM reservation_person rp INNER JOIN reservation r ON rp.reservation_id = r.reservation_id WHERE r.reservation_state_id = 1; CREATE OR REPLACE FORCE VIEW "LISTING_TRIP_ATTR_PERSON" ("TRIP_ID", "ATTRACTION_ID", "FIRST_NAME", "LAST_NAME") AS SELECT r.trip_id, ra.attraction_id, rp.first_name, rp.last_name FROM reservation r INNER JOIN reserved_attraction ra ON ra.reservation_id = r.reservation_id INNER JOIN reserved_attraction_details rad ON rad.reservation_id = ra.reservation_id AND rad.attraction_id = ra.attraction_id INNER JOIN reservation_person rp ON rp.reservation_person_id = rad.reservation_person_id WHERE r.reservation_state_id = 1 ORDER BY r.trip_id, ra.attraction_id, rp.last_name, rp.first_name; Analiza klientów firmy Poniższe widoki umożliwiają w szybki sposób zobaczyć zestawienie klientów pod względem ich wkładu w obroty naszej firmy. Policzona jest suma pieniędzy, które klient wydał na wycieczki, liczba 25 Struktura widoków Projekt Firma turystyczna P. Bryk, B. Szczepanik

27 różnych wykupionych wycieczek jak i sumy dotyczące liczby osób, dla których dany klient zamówił daną wycieczkę. Ostatni widok komponuje wszystkie trzy poprzednie. 1. CLIENT_CASH a. CLIENT_ID b. NAME c. CASH 2. CLIENT_TRIPS a. CLIENT_ID b. NAME c. TRIPS d. TRIPS_PEOPLE 3. CLIENT_ATTRACTIONS a. CLIENT_ID b. NAME c. ATTRACTIONS d. ATTRACTIONS_PEOPLE 4. CLIENT_ALL a. CLIENT_ID b. NAME c. CASH d. TRIPS e. TRIPS_PEOPLE f. ATTRACTIONS g. ATTRACTIONS_PEOPLE CREATE OR REPLACE FORCE VIEW "CLIENT_CASH" ("CLIENT_ID", "NAME", "CASH") AS SELECT cl.client_id, cl.name, SUM(NVL(p.AMOUNT, 0)) AS cash FROM reservation r INNER JOIN payment p ON r.reservation_id = p.reservation_id AND r.reservation_state_id IN (1,2) RIGHT OUTER JOIN CLIENT cl ON cl.client_id = r.client_id GROUP BY cl.client_id, cl.name ORDER BY cl.client_id; CREATE OR REPLACE FORCE VIEW "CLIENT_TRIPS" ("CLIENT_ID", "NAME", "TRIPS", "TRIPS_PEOPLE") AS SELECT cl.client_id, cl.name, COUNT(DISTINCT r.trip_id) AS trips, SUM(NVL(r.number_of_people, 0)) AS trips_people FROM reservation r RIGHT OUTER JOIN CLIENT cl Projekt Firma turystyczna P. Bryk, B. Szczepanik Struktura widoków 26

28 ON cl.client_id = r.client_id AND r.reservation_state_id IN (1,2) GROUP BY cl.client_id, cl.name ORDER BY cl.client_id; CREATE OR REPLACE FORCE VIEW "CLIENT_ATTRACTIONS" ("CLIENT_ID", "NAME", "ATTRACTIONS", "ATTRACTIONS_PEOPLE") AS SELECT cl.client_id, cl.name, COUNT(DISTINCT ra.attraction_id) AS attractions, SUM(NVL(ra.number_of_people, 0)) AS attractions_people FROM reservation r INNER JOIN reserved_attraction ra ON r.reservation_id = ra.reservation_id RIGHT OUTER JOIN CLIENT cl ON cl.client_id = r.client_id AND r.reservation_state_id IN(1,2) GROUP BY cl.client_id, cl.name ORDER BY cl.client_id; CREATE OR REPLACE FORCE VIEW "CLIENT_ALL" ("CLIENT_ID", "NAME", "CASH", "TRIPS", "TRIPS_PEOPLE", "ATTRACTIONS", "ATTRACTIONS_PEOPLE") AS SELECT cc.client_id, cc.name, cc.cash, ct.trips, ct.trips_people, ca.attractions, ca.attractions_people FROM client_cash cc INNER JOIN client_trips ct ON cc.client_id = ct.client_id INNER JOIN client_attractions ca ON ca.client_id = ct.client_id; Zarządzanie rezerwacjami Widoki z tej grupy mają na celu ułatwienie szybkiego wyszukiwania rezerwacji, które niedługo się kończą (aby przypomnieć o tym klientowi), które nie są kompletne, niedopłacone itd. Pierwszy liczy sumaryczny koszt rezerwacji, drugi wskazuje ilość podanych uczestników do rezerwacji wycieczki, trzeci to samo lecz dla atrakcji. Ostatni przedstawia aktualne rezerwacje posortowane malejąco za datą. Możemy szybko sprawdzić czy w którejś z kończących się rezerwacji jest coś nie tak. 1. RESERVATION_CASH a. RESERVATION_ID b. CASH_PAID c. COST d. TO_PAY 2. RESERVATION_PEOPLE a. RESERVATION_ID 27 Struktura widoków Projekt Firma turystyczna P. Bryk, B. Szczepanik

29 b. NUMBER_OF_PEOPLE c. GIVEN_PEOPLE d. MISSING_PEOPLE 3. RESERVATION_ATTR_PEOPLE a. RESERVATION_ID b. GIVEN_ATTR_PEOPLE c. ALL_ATTR_PEOPLE d. MISSING_ATTR_PEOPLE 4. RESERVATION_CURRENT a. RESERVATION_ID b. START_DATE c. READABLE_NAME d. TO_PAY e. MISSING_PEOPLE f. MISSING_ATTR_PEOPLE g. NAME h. PHONE CREATE OR REPLACE FORCE VIEW "RESERVATION_CASH" ("RESERVATION_ID", "CASH_PAID", "COST", "TO_PAY") AS SELECT r.reservation_id, NVL(SUM(p.amount),0) AS cash_paid, r.number_of_people * r.price_per_person + (SELECT NVL(SUM(number_of_people * price_per_person),0) FROM reserved_attraction WHERE reservation_id = r.reservation_id ) AS cost, r.number_of_people * r.price_per_person + (SELECT NVL(SUM(number_of_people * price_per_person),0) FROM reserved_attraction WHERE reservation_id = r.reservation_id ) - NVL( SUM(p.amount),0) AS to_pay FROM reservation r LEFT OUTER JOIN payment p ON p.reservation_id = r.reservation_id GROUP BY r.reservation_id, r.number_of_people, r.price_per_person ORDER BY r.reservation_id; CREATE OR REPLACE FORCE VIEW "RESERVATION_PEOPLE" ("RESERVATION_ID", "NUMBER_OF_PEOPLE", "GIVEN_PEOPLE", "MISSING_PEOPLE") AS SELECT r.reservation_id, r.number_of_people, COUNT(DISTINCT rp.reservation_person_id) AS given_people, r.number_of_people - COUNT(DISTINCT rp.reservation_person_id) AS missing_people FROM reservation r LEFT OUTER JOIN reservation_person rp Projekt Firma turystyczna P. Bryk, B. Szczepanik Struktura widoków 28

30 ON rp.reservation_id = r.reservation_id GROUP BY r.reservation_id, r.number_of_people; CREATE OR REPLACE FORCE VIEW "RESERVATION_ATTR_PEOPLE" ("RESERVATION_ID", "GIVEN_ATTR_PEOPLE", "ALL_ATTR_PEOPLE", "MISSING_ATTR_PEOPLE") AS SELECT r.reservation_id, (SELECT COUNT(*) FROM reserved_attraction_details WHERE reservation_id = r.reservation_id ) AS given_attr_people, (SELECT NVL(SUM(number_of_people),0) FROM reserved_attraction WHERE reservation_id = r.reservation_id ) AS all_attr_people, (SELECT NVL(SUM(number_of_people),0) FROM reserved_attraction WHERE reservation_id = r.reservation_id ) - (SELECT COUNT(*) FROM reserved_attraction_details WHERE reservation_id = r.reservation_id ) AS missing_attr_people FROM reservation r; CREATE OR REPLACE FORCE VIEW "RESERVATION_CURRENT" ("RESERVATION_ID", "START_DATE", "READABLE_NAME", "TO_PAY", "MISSING_PEOPLE", "MISSING_ATTR_PEOPLE", "NAME", "PHONE") AS SELECT rc.reservation_id, r.start_date, rs.readable_name, rc.to_pay, rp.missing_people, rap.missing_attr_people, cl.name, cl.phone FROM reservation r INNER JOIN reservation_cash rc ON rc.reservation_id = r.reservation_id INNER JOIN reservation_people rp ON rc.reservation_id = rp.reservation_id INNER JOIN reservation_attr_people rap ON rc.reservation_id = rap.reservation_id INNER JOIN client cl ON cl.client_id = r.client_id INNER JOIN reservation_state rs ON rs.reservation_state_id = r.reservation_state_id WHERE rs.reservation_state_id IN (1,2,3) ORDER BY r.start_date DESC; Zarządzanie wycieczkami i atrakcjami Kolejną grupą są widoki ułatwiające dostęp do danych wycieczek. Upraszczamy sprawdzanie liczby pozostałych wolnych miejsc, podział na miejsca zarezerwowane, opłacone (widok 2). Możemy sprawdzić ile rezerwacji dla danej wycieczki jest anulowanych. W łatwy sposób wyświetlimy też aktualne wycieczki i ich atrakcje, na które jeszcze mamy wolne miejsca (widok 3,4). Podobnie sprawa 29 Struktura widoków Projekt Firma turystyczna P. Bryk, B. Szczepanik

31 się ma z atrakcjami (widok 5 i 6 agregujący). Umożliwiamy też sprawdzenie bilansu całej wycieczki (widok 1). 1. TRIP_CASH a. TRIP_ID b. CASH 2. TRIP_PLACES a. TRIP_ID b. NUMBER_OF_PLACES c. FREE_PLACES d. RESERVED_PLACES e. PAID_PLACES f. CANCELLED_PLACES 3. TRIP_CURRENT a. TRIP.* b. FREE_PLACES 4. ATTRACTION_CURRENT a. ATTRACTION.* b. FREE_PLACES 5. ATTRACTION_PLACES a. TRIP_ID b. ATTRACTION_ID c. NUMBER_OF_PLACES d. FREE_PLACES e. RESERVED_PLACES f. PAID_PLACES g. CANCELLED_PLACES 6. TRIP_ATTR_PLACES a. TRIP_ID b. OVERALL_PLACES c. OVERALL_FREE_PLACES d. OVERALL_RESERVED_PLACES e. OVERALL_PAID_PLACES f. OVERALL_CANCELLED_PLACES CREATE OR REPLACE FORCE VIEW "TRIP_CASH" ("TRIP_ID", "CASH") AS SELECT t.trip_id, NVL(SUM(p.amount), 0) AS cash FROM reservation r INNER JOIN payment p ON r.reservation_id = p.reservation_id RIGHT OUTER JOIN trip t ON t.trip_id = r.trip_id GROUP BY t.trip_id; Projekt Firma turystyczna P. Bryk, B. Szczepanik Struktura widoków 30

32 CREATE OR REPLACE FORCE VIEW "TRIP_PLACES" ("TRIP_ID", "NUMBER_OF_PLACES", "FREE_PLACES", "RESERVED_PLACES", "PAID_PLACES", "CANCELLED_PLACES") AS SELECT trip_id, number_of_places, number_of_places - (SELECT NVL(SUM(number_of_people),0) FROM reservation WHERE trip_id = t.trip_id AND reservation_state_id NOT IN (4,5) ) AS free_places, (SELECT NVL(SUM(number_of_people),0) FROM reservation WHERE trip_id = t.trip_id AND reservation_state_id = 3 ) AS reserved_places, (SELECT NVL(SUM(number_of_people),0) FROM reservation WHERE trip_id = t.trip_id AND reservation_state_id = 1 ) AS paid_places, (SELECT NVL(SUM(number_of_people),0) FROM reservation WHERE trip_id = t.trip_id AND reservation_state_id IN (4,5) ) AS cancelled_places FROM trip t; CREATE OR REPLACE FORCE VIEW "TRIP_CURRENT" ("TRIP_ID", "COUNTRY_ID", "NAME", "DESCRIPTION", "RESERVATION_END_DATE", "CURRENT_PRICE_PER_PERSON", "NUMBER_OF_PLACES", "FREE_PLACES") AS SELECT t."trip_id", t."country_id", t."name", t."description", t."reservation_end_date", t."current_price_per_person", t."number_of_places", tp.free_places FROM trip_places tp INNER JOIN trip t ON t.trip_id = tp.trip_id WHERE t.reservation_end_date > sysdate; CREATE OR REPLACE FORCE VIEW "ATTRACTION_CURRENT" ("ATTRACTION_ID", "TRIP_ID", "NAME", "CURRENT_PRICE_PER_PERSON", "DESCRIPTION", "NUMBER_OF_PLACES", "FREE_PLACES") AS SELECT a."attraction_id", a."trip_id", a."name", a."current_price_per_person", a."description", a."number_of_places", ap.free_places FROM attraction_places ap INNER JOIN attraction a 31 Struktura widoków Projekt Firma turystyczna P. Bryk, B. Szczepanik

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

Wyzwalacze. do automatycznego generowania wartości kluczy głównych. Składnia instrukcji tworzacej wyzwalacz Wyzwalacze Wyzwalacze są specjalnymi procedurami składowanymi, uruchamianymi automatycznie w następstwie zaistnienia określonego typu zdarzenia. Ich główne zadanie polega na wymuszaniu integralności danych

Bardziej szczegółowo

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

Instrukcja podwaja zarobki osób, których imiona zaczynają się P i dalsze litery alfabetu zakładamy, że takich osbób jest kilkanaście. Rodzaje triggerów Triggery DML na tabelach INSERT, UPDATE, DELETE Triggery na widokach INSTEAD OF Triggery DDL CREATE, ALTER, DROP Triggery na bazie danych SERVERERROR, LOGON, LOGOFF, STARTUP, SHUTDOWN

Bardziej szczegółowo

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

Plan bazy: Kod zakładający bazę danych: DROP TABLE noclegi CASCADE; CREATE TABLE noclegi( id_noclegu SERIAL NOT NULL, Mój projekt przedstawia bazę danych noclegów składającą się z 10 tabel. W projekcie wykorzystuje program LibreOffice Base do połączenia psql z graficznym interfejsem ( kilka formularzy przedstawiających

Bardziej szczegółowo

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

1: 2: 3: 4: 5: 6: 7: 8: 9: 10: Grupa A (LATARNIE) Imię i nazwisko: Numer albumu: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: Nazwisko prowadzącego: 11: 12: Suma: Ocena: Zad. 1 (10 pkt) Dana jest relacja T. Podaj wynik poniższego zapytania (podaj

Bardziej szczegółowo

BAZA DANYCH SIECI HOTELI

BAZA DANYCH SIECI HOTELI Paulina Gogół s241906 BAZA DANYCH SIECI HOTELI Baza jest częścią systemu zarządzającego pewną siecią hoteli. Składa się z tabeli powiązanych ze sobą różnymi relacjami. Służy ona lepszemu zorganizowaniu

Bardziej szczegółowo

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

Procedury wyzwalane. (c) Instytut Informatyki Politechniki Poznańskiej 1 Procedury wyzwalane procedury wyzwalane, cel stosowania, typy wyzwalaczy, wyzwalacze na poleceniach DML i DDL, wyzwalacze typu INSTEAD OF, przykłady zastosowania, zarządzanie wyzwalaczami 1 Procedury wyzwalane

Bardziej szczegółowo

Wykład 8. SQL praca z tabelami 5

Wykład 8. SQL praca z tabelami 5 Wykład 8 SQL praca z tabelami 5 Podzapytania to mechanizm pozwalający wykorzystywać wyniki jednego zapytania w innym zapytaniu. Nazywane często zapytaniami zagnieżdżonymi. Są stosowane z zapytaniami typu

Bardziej szczegółowo

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

Blaski i cienie wyzwalaczy w relacyjnych bazach danych. Mgr inż. Andrzej Ptasznik Blaski i cienie wyzwalaczy w relacyjnych bazach danych. Mgr inż. Andrzej Ptasznik Technologia Przykłady praktycznych zastosowań wyzwalaczy będą omawiane na bazie systemu MS SQL Server 2005 Wprowadzenie

Bardziej szczegółowo

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

E.14 Bazy Danych cz. 18 SQL Funkcje, procedury składowane i wyzwalacze Funkcje użytkownika Tworzenie funkcji Usuwanie funkcji Procedury składowane Tworzenie procedur składowanych Usuwanie procedur składowanych Wyzwalacze Wyzwalacze a ograniczenia i procedury składowane Tworzenie

Bardziej szczegółowo

Przykładowa baza danych BIBLIOTEKA

Przykładowa baza danych BIBLIOTEKA Przykładowa baza danych BIBLIOTEKA 1. Opis problemu W ramach zajęć zostanie przedstawiony przykład prezentujący prosty system biblioteczny. System zawiera informację o czytelnikach oraz książkach dostępnych

Bardziej szczegółowo

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

Wyzwalacz - procedura wyzwalana, składowana fizycznie w bazie, uruchamiana automatycznie po nastąpieniu określonego w definicji zdarzenia Wyzwalacz - procedura wyzwalana, składowana fizycznie w bazie, uruchamiana automatycznie po nastąpieniu określonego w definicji zdarzenia Składowe wyzwalacza ( ECA ): określenie zdarzenia ( Event ) określenie

Bardziej szczegółowo

Cele. Definiowanie wyzwalaczy

Cele. Definiowanie wyzwalaczy WYZWALACZE Definiowanie wyzwalaczy Cele Wyjaśnić cel istnienia wyzwalaczy Przedyskutować zalety wyzwalaczy Wymienić i opisać cztery typy wyzwalaczy wspieranych przez Adaptive Server Anywhere Opisać dwa

Bardziej szczegółowo

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

Wykład 5 funkcje i procedury pamiętane widoki (perspektywy) wyzwalacze Wykład 5 funkcje i procedury pamiętane widoki (perspektywy) wyzwalacze 1 Funkcje i procedury pamiętane Następujące polecenie tworzy zestawienie zawierające informację o tym ilu jest na naszej hipotetycznej

Bardziej szczegółowo

Kowalski Marcin 156439 Wrocław, dn. 3.06.2009 Jaśkiewicz Kamil 148592. Bazy Danych 1 Podstawy Projekt Temat: Baza danych do zarządzania projektami

Kowalski Marcin 156439 Wrocław, dn. 3.06.2009 Jaśkiewicz Kamil 148592. Bazy Danych 1 Podstawy Projekt Temat: Baza danych do zarządzania projektami Kowalski Marcin 156439 Wrocław, dn. 3.06.2009 Jaśkiewicz Kamil 148592 Bazy Danych 1 Podstawy Projekt Temat: Baza danych do zarządzania projektami Spis treści Założenia Projektowe...1 Schemat Bazy Danych...1

Bardziej szczegółowo

Aspekty aktywne baz danych

Aspekty aktywne baz danych Aspekty aktywne baz danych Aktywne aspekty baz danych Baza danych powinna zapewniać pewne własności i niezmienniki; Własności te powinny mogą być zapisane do bazy danych, a baza danych powinna zapewniać

Bardziej szczegółowo

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

Przykład 3 Zdefiniuj w bazie danych hurtownia_nazwisko przykładową funkcję użytkownika fn_rok; Temat: Funkcje, procedury i wyzwalacze. Oprócz tabel i widoków w bazach danych możemy tworzyć własne funkcje, procedury i specjalny typ procedur, które będą automatycznie wywoływanie przez MySQL w memencie

Bardziej szczegółowo

Hurtownia Świętego Mikołaja projekt bazy danych

Hurtownia Świętego Mikołaja projekt bazy danych Aleksandra Kobusińska nr indeksu: 218366 Hurtownia Świętego Mikołaja projekt bazy danych Zaprezentowana poniżej baza jest częścią większego projektu bazy danych wykorzystywanej w krajowych oddziałach wiosek

Bardziej szczegółowo

Bazy Danych I Projekt Firma Turystyczna

Bazy Danych I Projekt Firma Turystyczna Bazy Danych I Projekt Firma Turystyczna Autor: Paweł Bara 1. Struktura bazy danych. Baza danych ma stanowić magazyn informacji o transakcjach prowadzonych przez pewne biuro podróży. Biuro to sprzedaje

Bardziej szczegółowo

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

KOLEKCJE - to typy masowe,zawierające pewną liczbę jednorodnych elementów KOLEKCJE - to typy masowe,zawierające pewną liczbę jednorodnych elementów SQL3 wprowadza następujące kolekcje: zbiory ( SETS ) - zestaw elementów bez powtórzeń, kolejność nieistotna listy ( LISTS ) - zestaw

Bardziej szczegółowo

Język SQL, zajęcia nr 1

Język SQL, zajęcia nr 1 Język SQL, zajęcia nr 1 SQL - Structured Query Language Strukturalny język zapytań Login: student Hasło: stmeil14 Baza danych: st https://194.29.155.15/phpmyadmin/index.php Andrzej Grzebielec Najpopularniejsze

Bardziej szczegółowo

Administracja i programowanie pod Microsoft SQL Server 2000

Administracja i programowanie pod Microsoft SQL Server 2000 Administracja i programowanie pod Paweł Rajba pawel@ii.uni.wroc.pl http://www.kursy24.eu/ Zawartość modułu 6 Wyzwalacze Wprowadzenie Tworzenie wyzwalacza Wyzwalacze typu,,po'' Wyzwalacze typu,,zamiast''

Bardziej szczegółowo

Wykład 5. SQL praca z tabelami 2

Wykład 5. SQL praca z tabelami 2 Wykład 5 SQL praca z tabelami 2 Wypełnianie tabel danymi Tabele można wypełniać poprzez standardową instrukcję INSERT INTO: INSERT [INTO] nazwa_tabeli [(kolumna1, kolumna2,, kolumnan)] VALUES (wartosc1,

Bardziej szczegółowo

Oracle PL/SQL. Paweł Rajba. pawel@ii.uni.wroc.pl http://www.kursy24.eu/

Oracle PL/SQL. Paweł Rajba. pawel@ii.uni.wroc.pl http://www.kursy24.eu/ Paweł Rajba pawel@ii.uni.wroc.pl http://www.kursy24.eu/ Zawartość modułu 6 Wprowadzenie Definiowanie wyzwalaczy DML Metadane wyzwalaczy Inne zagadnienia, tabele mutujące Wyzwalacze INSTEAD OF Wyzwalacze

Bardziej szczegółowo

LAB 6 BEGIN TRANSACTION, COMMIT, ROLLBACK, SET TRANSACTION ISOLATION LEVEL,

LAB 6 BEGIN TRANSACTION, COMMIT, ROLLBACK, SET TRANSACTION ISOLATION LEVEL, Informatyka sem. III studia inżynierskie Transport 2018/19 Lab 6 LAB 6 TRANSACTION, COMMIT, ROLLBACK, SET TRANSACTION ISOLATION LEVEL, UPDATE, INSERT INTO, ALTER TABLE, CREATE VIEW, CREATE TRIGGER, FUNCTION,

Bardziej szczegółowo

PRZESTRZENNE BAZY DANYCH WYKŁAD 2

PRZESTRZENNE BAZY DANYCH WYKŁAD 2 PRZESTRZENNE BAZY DANYCH WYKŁAD 2 Baza danych to zbiór plików, które fizycznie przechowują dane oraz system, który nimi zarządza (DBMS, ang. Database Management System). Zadaniem DBMS jest prawidłowe przechowywanie

Bardziej szczegółowo

Zaawansowane bazy danych i hurtownie danych semestr I

Zaawansowane bazy danych i hurtownie danych semestr I Podprogramy Wydział Informatyki Politechnika Białostocka Zaawansowane bazy danych i hurtownie danych semestr I Procedury do przeprowadzenia akcji Funkcje do obliczania wartości Pakiety do zbierania logicznie

Bardziej szczegółowo

Rozdział 17. Zarządzanie współbieżnością zadania dodatkowe

Rozdział 17. Zarządzanie współbieżnością zadania dodatkowe Rozdział 17. Zarządzanie współbieżnością zadania dodatkowe -- Definicje relacji i utworzenie stanu początkowego dla ćwiczeń z synchronizacji transakcji DROP TABLE Konta cascade constraints; DROP TABLE

Bardziej szczegółowo

Paweł Rajba pawel@ii.uni.wroc.pl http://www.itcourses.eu/

Paweł Rajba pawel@ii.uni.wroc.pl http://www.itcourses.eu/ Paweł Rajba pawel@ii.uni.wroc.pl http://www.itcourses.eu/ Wprowadzenie Historia i standardy Podstawy relacyjności Typy danych DDL tabele, widoki, sekwencje zmiana struktury DML DQL Podstawy, złączenia,

Bardziej szczegółowo

Podstawy języka SQL. SQL Structured Query Languagestrukturalny

Podstawy języka SQL. SQL Structured Query Languagestrukturalny Podstawy języka SQL SQL Structured Query Languagestrukturalny język zapytań DDL Język definicji danych (np. tworzenie tabel) DML Język manipulacji danych (np. tworzenie zapytań) DCL Język kontroli danych

Bardziej szczegółowo

Pawel@Kasprowski.pl Bazy danych. Bazy danych. Podstawy języka SQL. Dr inż. Paweł Kasprowski. pawel@kasprowski.pl

Pawel@Kasprowski.pl Bazy danych. Bazy danych. Podstawy języka SQL. Dr inż. Paweł Kasprowski. pawel@kasprowski.pl Bazy danych Podstawy języka SQL Dr inż. Paweł Kasprowski pawel@kasprowski.pl Plan wykładu Relacyjne bazy danych Język SQL Zapytania SQL (polecenie select) Bezpieczeństwo danych Integralność danych Współbieżność

Bardziej szczegółowo

Wykład 05 Bazy danych

Wykład 05 Bazy danych Wykład 05 Bazy danych Tabela składa się z: Kolumn Wierszy Wartości Nazwa Wartości Opis INT [UNSIGNED] -2^31..2^31-1 lub 0..2^32-1 Zwykłe liczby całkowite VARCHAR(n) n = długość [1-255] Łańcuch znaków o

Bardziej szczegółowo

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

Bazy danych wykład szósty Więzy i wyzwalacze. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, wykładwarszawa) Bazy danych wykład szósty Więzy i wyzwalacze Konrad Zdanowski Uniwersytet Kardynała Stefana Wyszyńskiego, Warszawa szósty Więzy i wyzwalacze 1 / 35 Wstęp Wiemy jak nakładać pewne ograniczenia (więzy) w

Bardziej szczegółowo

Oracle11g: Wprowadzenie do SQL

Oracle11g: Wprowadzenie do SQL Oracle11g: Wprowadzenie do SQL OPIS: Kurs ten oferuje uczestnikom wprowadzenie do technologii bazy Oracle11g, koncepcji bazy relacyjnej i efektywnego języka programowania o nazwie SQL. Kurs dostarczy twórcom

Bardziej szczegółowo

15. Funkcje i procedury składowane PL/SQL

15. Funkcje i procedury składowane PL/SQL 15. Funkcje i procedury składowane PLSQL 15.1. SQL i PLSQL (Structured Query Language - SQL) Język zapytań strukturalnych SQL jest zbiorem poleceń, za pomocą których programy i uŝytkownicy uzyskują dostęp

Bardziej szczegółowo

Przykłady najlepiej wykonywać od razu na bazie i eksperymentować z nimi.

Przykłady najlepiej wykonywać od razu na bazie i eksperymentować z nimi. Marek Robak Wprowadzenie do języka SQL na przykładzie baz SQLite Przykłady najlepiej wykonywać od razu na bazie i eksperymentować z nimi. Tworzenie tabeli Pierwsza tabela W relacyjnych bazach danych jedna

Bardziej szczegółowo

Bazy danych SQL Server 2005

Bazy danych SQL Server 2005 Bazy danych SQL Server 2005 TSQL Michał Kuciapski Typ zadania: Podstawowe zapytania Select Zadanie 1: Wyświetl następujące informacje z bazy: A. 1. Wyświetl informacje o klientach: nazwa firmy, imie, nazwisko,

Bardziej szczegółowo

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

Laboratorium nr 4. Temat: SQL część II. Polecenia DML Laboratorium nr 4 Temat: SQL część II Polecenia DML DML DML (Data Manipulation Language) słuŝy do wykonywania operacji na danych do ich umieszczania w bazie, kasowania, przeglądania, zmiany. NajwaŜniejsze

Bardziej szczegółowo

Wprowadzenie do BD Operacje na bazie i tabelach Co poza zapytaniami? Algebra relacji. Bazy Danych i Systemy informacyjne Wykład 2.

Wprowadzenie do BD Operacje na bazie i tabelach Co poza zapytaniami? Algebra relacji. Bazy Danych i Systemy informacyjne Wykład 2. Bazy Danych i Systemy informacyjne Wykład 2 Piotr Syga 16.10.2017 Dodawanie, usuwanie i zmienianie rekordów Wstawianie rekordu wstawianie do tabeli INSERT INTO A VALUES ( fioletowy, okrągły, słodko-kwaśny

Bardziej szczegółowo

Systemy baz danych 2 laboratorium Projekt zaliczeniowy

Systemy baz danych 2 laboratorium Projekt zaliczeniowy Dany jest następujący logiczny schemat bazy danych Systemy baz danych 2 laboratorium Projekt zaliczeniowy FAKTURY POZYCJE PK f_id_faktury PK p_id_pozycji f_data_wystawienia f_data_płatnosci f_czy_zaplacona

Bardziej szczegółowo

SQL 4 Structured Query Lenguage

SQL 4 Structured Query Lenguage Wykład 5 SQL 4 Structured Query Lenguage Instrukcje sterowania danymi Bazy Danych - A. Dawid 2011 1 CREATE USER Tworzy nowego użytkownika Składnia CREATE USER specyfikacja użytkownika [, specyfikacja użytkownika]...

Bardziej szczegółowo

INTERNETOWE BAZY DANYCH materiały pomocnicze - wykład X

INTERNETOWE BAZY DANYCH materiały pomocnicze - wykład X Wrocław 2006 INTERNETOWE BAZY DANYCH materiały pomocnicze - wykład X Paweł Skrobanek C-3, pok. 323 e-mail: pawel.skrobanek@pwr.wroc.pl INTERNETOWE BAZY DANYCH PLAN NA DZIŚ zajęcia 1: 2. Procedury składowane

Bardziej szczegółowo

Struktura drzewa w MySQL. Michał Tyszczenko

Struktura drzewa w MySQL. Michał Tyszczenko Struktura drzewa w MySQL Michał Tyszczenko W informatyce drzewa są strukturami danych reprezentującymi drzewa matematyczne. W naturalny sposób reprezentują hierarchię danych toteż głównie do tego celu

Bardziej szczegółowo

DECLARE VARIABLE zmienna1 typ danych; BEGIN

DECLARE VARIABLE zmienna1 typ danych; BEGIN Procedury zapamiętane w Interbase - samodzielne programy napisane w specjalnym języku (właściwym dla serwera baz danych Interbase), który umożliwia tworzenie zapytań, pętli, instrukcji warunkowych itp.;

Bardziej szczegółowo

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

Język PL/SQL Procedury i funkcje składowane Język PL/SQL Procedury i funkcje składowane Podprogramy, procedury i funkcje składowane, typy argumentów, wywoływanie procedur i funkcji, poziomy czystości funkcji 1 Podprogramy Procedury (wykonują określone

Bardziej szczegółowo

Bazy danych. dr inż. Arkadiusz Mirakowski

Bazy danych. dr inż. Arkadiusz Mirakowski Bazy danych dr inż. Arkadiusz Mirakowski Początek pracy z Transact SQL (T-SQL) 153.19.7.13,1401 jkowalski nr indeksu 2 Perspektywa - tabela tymczasowa - grupowanie Perspektywa (widok) Perspektywa (widok)

Bardziej szczegółowo

Relacyjne bazy danych. Podstawy SQL

Relacyjne bazy danych. Podstawy SQL Relacyjne bazy danych Podstawy SQL Język SQL SQL (Structured Query Language) język umożliwiający dostęp i przetwarzanie danych w bazie danych na poziomie obiektów modelu relacyjnego tj. tabel i perspektyw.

Bardziej szczegółowo

Język SQL, zajęcia nr 2

Język SQL, zajęcia nr 2 Język SQL, zajęcia nr 2 SQL - Structured Query Language Strukturalny język zapytań Login: student Hasło: stmeil14 Baza danych: st https://194.29.155.15/phpmyadmin/index.php Andrzej Grzebielec Funkcja agregująca

Bardziej szczegółowo

Bartosz Jachnik - Kino

Bartosz Jachnik - Kino Bartosz Jachnik - Kino I. Opis bazy Prezentowana baza danych stworzona została na potrzeby prowadzenia kina. Zawiera ona 8 tabel, które opisują filmy grane w danym okresie w kinie, wraz ze szczegółowym

Bardziej szczegółowo

1. Tworzenie tabeli. 2. Umieszczanie danych w tabeli

1. Tworzenie tabeli. 2. Umieszczanie danych w tabeli 1. Tworzenie tabeli Aby stworzyć tabele w SQL-u należy użyć polecenia CREATE TABLE nazwa_tabeli (nazwa_pola1 właściwości_pola1, nazwa_pola2 właściwości_pola2, itd.) Nazwa_tabeli to wybrana przez nas nazwa

Bardziej szczegółowo

SELECT * FROM tabela WHERE warunek wybiera dane spełniające podany warunek

SELECT * FROM tabela WHERE warunek wybiera dane spełniające podany warunek SELECT SELECT kolumna1, kolumna2,, kolumnan FROM tabela wybrane kolumny SELECT * FROM tabela wszystkie kolumny select * from Orders select CustomerID, CompanyName, Country from Customers WHERE SELECT *

Bardziej szczegółowo

Bazy danych Ćwiczenia projektowe

Bazy danych Ćwiczenia projektowe Bazy danych Ćwiczenia projektowe Przygotował: Piotr Hajder Katedra Informatyki Stosowanej i Modelowania Wydział Inżynierii Metali i Informatyki Przemysłowej, AGH Agenda 01. Powtórka 02. Interfejs CRUD

Bardziej szczegółowo

Systemy GIS Tworzenie zapytań w bazach danych

Systemy GIS Tworzenie zapytań w bazach danych Systemy GIS Tworzenie zapytań w bazach danych Wykład nr 6 Analizy danych w systemach GIS Jak pytać bazę danych, żeby otrzymać sensowną odpowiedź......czyli podstawy języka SQL INSERT, SELECT, DROP, UPDATE

Bardziej szczegółowo

Składowane procedury i funkcje

Składowane procedury i funkcje Składowane procedury i funkcje Procedury i funkcje są zestawem poleceń SQL, które są przechowywane na serwerze (tak jak dane w tablicach). Istnieją sytuacje, kiedy procedury i funkcje są szczególnie przydatne.

Bardziej szczegółowo

Zarzadzanie transakcjami. Transakcje

Zarzadzanie transakcjami. Transakcje Transakcje Transakcja: ciąg zawierający jedno lub wiele poleceń SQL, zgrupowanych razem jako jedna logiczna jednostka działań, której nie można podzielić. Logiczna jednostka działań to zbiór logicznych

Bardziej szczegółowo

Bazy danych. Polecenia SQL

Bazy danych. Polecenia SQL Bazy danych Baza danych, to miejsce przechowywania danych. Dane w bazie danych są podzielone na tabele. Tabele składają się ze ściśle określonych pól i rekordów. Każde pole w rekordzie ma ściśle ustalony

Bardziej szczegółowo

Podstawy języka SQL Co to jest SQL? Możliwości SQL SQL*Plus

Podstawy języka SQL Co to jest SQL? Możliwości SQL SQL*Plus Podstawy języka SQL Co to jest SQL? Structured Query Language uchodzi za standard języka zapytań kierowanych do systemu zarządzania bazą danych. SQL jest językiem deklaratywnym tj. takim, w którym istotne

Bardziej szczegółowo

Wprowadzenie do projektowania i wykorzystania baz danych Relacje

Wprowadzenie do projektowania i wykorzystania baz danych Relacje Wprowadzenie do projektowania i wykorzystania baz danych Relacje Katarzyna Klessa Dygresja nt. operatorów SELECT 2^2 SELECT 2^30 SELECT 50^50 2 Dygresja nt. operatorów SELECT 2^30 --Bitwise exclusive OR

Bardziej szczegółowo

Tworzenie widoku CREATE OR REPLACE VIEW [nazwa_widoku] AS SELECT [nazwy_kolumn] FROM [nazwa_tablicy];

Tworzenie widoku CREATE OR REPLACE VIEW [nazwa_widoku] AS SELECT [nazwy_kolumn] FROM [nazwa_tablicy]; Widoki/Perspektywy Podstawy Tworzenie widoku CREATE OR REPLACE VIEW [nazwa_widoku] AS SELECT [nazwy_kolumn] FROM [nazwa_tablicy]; Usuwanie widoku DROP VIEW [nazwa_widoku]; Przykład 1 Przykład najprostszego

Bardziej szczegółowo

1. Połączenie z bazą danych. W wybranym edytorze tworzymy plik sqltest.py i umieszczamy w nim poniższy kod. #!/usr/bin/python3 import sqlite3

1. Połączenie z bazą danych. W wybranym edytorze tworzymy plik sqltest.py i umieszczamy w nim poniższy kod. #!/usr/bin/python3 import sqlite3 cur.executescript(""" DROP TABLE IF EXISTS uczen; CREATE TABLE IF NOT EXISTS uczen ( Uniwersytet Technologiczno-Przyrodniczy im. J.J. Śniadeckich w Bydgoszczy Instrukcja do ćwiczeń laboratoryjnych Przedmiot

Bardziej szczegółowo

SQL (ang. Structured Query Language)

SQL (ang. Structured Query Language) SQL (ang. Structured Query Language) SELECT pobranie danych z bazy, INSERT umieszczenie danych w bazie, UPDATE zmiana danych, DELETE usunięcie danych z bazy. Rozkaz INSERT Rozkaz insert dodaje nowe wiersze

Bardziej szczegółowo

Projektowanie systemów baz danych

Projektowanie systemów baz danych Projektowanie systemów baz danych Seweryn Dobrzelewski 4. Projektowanie DBMS 1 SQL SQL (ang. Structured Query Language) Język SQL jest strukturalnym językiem zapewniającym możliwość wydawania poleceń do

Bardziej szczegółowo

Język SQL. Rozdział 10. Perspektywy Stosowanie perspektyw, tworzenie perspektyw prostych i złożonych, perspektywy modyfikowalne i niemodyfikowalne.

Język SQL. Rozdział 10. Perspektywy Stosowanie perspektyw, tworzenie perspektyw prostych i złożonych, perspektywy modyfikowalne i niemodyfikowalne. Język SQL. Rozdział 10. Perspektywy Stosowanie perspektyw, tworzenie perspektyw prostych i złożonych, perspektywy modyfikowalne i niemodyfikowalne. 1 Perspektywa Perspektywa (ang. view) jest strukturą

Bardziej szczegółowo

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

Bazy danych 6. Klucze obce. P. F. Góra Bazy danych 6. Klucze obce P. F. Góra http://th-www.if.uj.edu.pl/zfs/gora/ 2018 Dygresja: Metody przechowywania tabel w MySQL Tabele w MySQL moga być przechowywane na kilka sposobów. Sposób ten (żargonowo:

Bardziej szczegółowo

Programowanie MSQL. show databases; - pokazanie jakie bazy danych są dostępne na koncie

Programowanie MSQL. show databases; - pokazanie jakie bazy danych są dostępne na koncie Programowanie MSQL show databases; - pokazanie jakie bazy danych są dostępne na koncie show databases; - wyświetlenie wszystkich baz danych na serwerze create database nazwa; - za nazwa wstawiamy wybraną

Bardziej szczegółowo

Ref. 7 - Język SQL - polecenia DDL i DML

Ref. 7 - Język SQL - polecenia DDL i DML Ref. 7 - Język SQL - polecenia DDL i DML Wprowadzenie do języka SQL. Polecenia generujące strukturę bazy danych: CREATE, ALTER i DROP. Polecenia: wprowadzające dane do bazy - INSERT, modyfikujące zawartość

Bardziej szczegółowo

opisuje nazwy kolumn, wyrażenia arytmetyczne, funkcje nazwy tabel lub widoków warunek (wybieranie wierszy)

opisuje nazwy kolumn, wyrażenia arytmetyczne, funkcje nazwy tabel lub widoków warunek (wybieranie wierszy) Zapytania SQL. Polecenie SELECT jest używane do pobierania danych z bazy danych (z tabel lub widoków). Struktura polecenia SELECT SELECT FROM WHERE opisuje nazwy kolumn, wyrażenia arytmetyczne, funkcje

Bardziej szczegółowo

Perspektywy Stosowanie perspektyw, tworzenie perspektyw prostych i złożonych, perspektywy modyfikowalne i niemodyfikowalne, perspektywy wbudowane.

Perspektywy Stosowanie perspektyw, tworzenie perspektyw prostych i złożonych, perspektywy modyfikowalne i niemodyfikowalne, perspektywy wbudowane. Perspektywy Stosowanie perspektyw, tworzenie perspektyw prostych i złożonych, perspektywy modyfikowalne i niemodyfikowalne, perspektywy wbudowane. 1 Perspektywa Perspektywa (ang. view) jest strukturą logiczną

Bardziej szczegółowo

Bloki anonimowe w PL/SQL

Bloki anonimowe w PL/SQL Język PL/SQL PL/SQL to specjalny język proceduralny stosowany w bazach danych Oracle. Język ten stanowi rozszerzenie SQL o szereg instrukcji, znanych w proceduralnych językach programowania. Umożliwia

Bardziej szczegółowo

koledzy, Jan, Nowak, ul. Niecała 8/23, , Wrocław, , ,

koledzy, Jan, Nowak, ul. Niecała 8/23, , Wrocław, , , Celem ćwiczeń jest zaprojektowanie oraz utworzenie na serwerze bazy danych przechowującej informacje na temat danych kontaktowych. Celem jest również zapoznanie z podstawowymi zapytaniami języka SQL służącymi

Bardziej szczegółowo

Inżynieria Programowania Laboratorium 3 Projektowanie i implementacja bazy danych. Paweł Paduch paduch@tu.kielce.pl

Inżynieria Programowania Laboratorium 3 Projektowanie i implementacja bazy danych. Paweł Paduch paduch@tu.kielce.pl Inżynieria Programowania Laboratorium 3 Projektowanie i implementacja bazy danych Paweł Paduch paduch@tu.kielce.pl 06-04-2013 Rozdział 1 Wstęp Na dzisiejszych zajęciach zajmiemy się projektem bazy danych.

Bardziej szczegółowo

strukturalny język zapytań używany do tworzenia i modyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych

strukturalny język zapytań używany do tworzenia i modyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych SQL SQL (ang. Structured Query Language): strukturalny język zapytań używany do tworzenia strukturalny język zapytań używany do tworzenia i modyfikowania baz danych oraz do umieszczania i pobierania danych

Bardziej szczegółowo

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

Bazy danych. Wykład IV SQL - wprowadzenie. Copyrights by Arkadiusz Rzucidło 1 Bazy danych Wykład IV SQL - wprowadzenie Copyrights by Arkadiusz Rzucidło 1 Czym jest SQL Język zapytań deklaratywny dostęp do danych Składnia łatwa i naturalna Standardowe narzędzie dostępu do wielu różnych

Bardziej szczegółowo

Bazy Danych - Instrukcja do Ćwiczenia laboratoryjnego nr 8

Bazy Danych - Instrukcja do Ćwiczenia laboratoryjnego nr 8 Bazy Danych - Instrukcja do Ćwiczenia laboratoryjnego nr 8 Bazowy skrypt PHP do ćwiczeń z bazą MySQL: Utwórz skrypt o nazwie cw7.php zawierający następującą treść (uzupełniając go o właściwą nazwę uŝytkownika

Bardziej szczegółowo

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

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

Bardziej szczegółowo

Baza danych sql. 1. Wprowadzenie. 2. Repozytaria generyczne

Baza danych sql. 1. Wprowadzenie. 2. Repozytaria generyczne Baza danych sql 1. Wprowadzenie Do tej pory operowaliście na listach. W tej instrukcji pokazane zostanie jak stworzyć bazę danych. W zadaniu skorzystamy z możliwości utworzenia struktury bazy danych z

Bardziej szczegółowo

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

Używany kiedy pełna treść instrukcji SQL jest nieznana przed uruchomieniem programu. Plan wykładu Spis treści 1 Dynamiczny SQL 1 2 Wyzwalacze 2 3 Podsumowanie 9 4 Źródła 9 1 Dynamiczny SQL Dynamiczny SQL Dynamiczny SQL - technika programowania umożliwiająca generowanie instrukcji SQL dynamicznie

Bardziej szczegółowo

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

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 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 będziemy używać w taki sam sposób, jak wbudowanych funkcji

Bardziej szczegółowo

Język SQL. Rozdział 8. Język manipulowania danymi DML

Język SQL. Rozdział 8. Język manipulowania danymi DML Język SQL. Rozdział 8. Język manipulowania danymi DML Wstawianie danych i polecenie INSERT, modyfikowanie danych i polecenie UPDATE, usuwanie danych i polecenie DELETE, połączenia modyfikowalne, sekwencje.

Bardziej szczegółowo

Instytut Mechaniki i Inżynierii Obliczeniowej fb.com/groups/bazydanychmt/

Instytut Mechaniki i Inżynierii Obliczeniowej   fb.com/groups/bazydanychmt/ Instytut Mechaniki i Inżynierii Obliczeniowej www.imio.polsl.pl fb.com/imiopolsl @imiopolsl fb.com/groups/bazydanychmt/ Wydział Mechaniczny technologiczny Politechnika Śląska Laboratorium 3 (Tworzenie

Bardziej szczegółowo

PODSTAWY BAZ DANYCH 13. PL/SQL

PODSTAWY BAZ DANYCH 13. PL/SQL PODSTAWY BAZ DANYCH 13. PL/SQL 1 Wprowadzenie do języka PL/SQL Język PL/SQL - rozszerzenie SQL o elementy programowania proceduralnego. Możliwość wykorzystywania: zmiennych i stałych, instrukcji sterujących

Bardziej szczegółowo

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Instytut Mechaniki i Inżynierii Obliczeniowej   Wydział Mechaniczny Technologiczny Politechnika Śląska Instytut Mechaniki i Inżynierii Obliczeniowej www.imio.polsl.pl fb.com/imiopolsl @imiopolsl Wydział Mechaniczny Technologiczny Politechnika Śląska Laboratorium 1 Wprowadzenie, podstawowe informacje o obsłudze

Bardziej szczegółowo

Pawel@Kasprowski.pl Bazy danych. Bazy danych. Zapytania SELECT. Dr inż. Paweł Kasprowski. pawel@kasprowski.pl

Pawel@Kasprowski.pl Bazy danych. Bazy danych. Zapytania SELECT. Dr inż. Paweł Kasprowski. pawel@kasprowski.pl Bazy danych Zapytania SELECT Dr inż. Paweł Kasprowski pawel@kasprowski.pl Przykład HAVING Podaj liczebność zespołów dla których najstarszy pracownik urodził się po 1940 select idz, count(*) from prac p

Bardziej szczegółowo

Tworzenie tabeli przez select CREATE TABLE PRAC2 AS SELECT P.NAZWISKO, Z.NAZWA FROM PRAC P NATURAL JOIN ZESP Z

Tworzenie tabeli przez select CREATE TABLE PRAC2 AS SELECT P.NAZWISKO, Z.NAZWA FROM PRAC P NATURAL JOIN ZESP Z Tworzenie tabeli Np. create table nazwa_tab( \\stworzenie tabeli Id numer(4) constraint PRAC_PK primary key, \\ustawiamy klucz podst. Nazwisko varchar2(30), \\typ tekstowy 30 znaków Kwota number(10,2)

Bardziej szczegółowo

W SQL Serwerze 2008 wprowadzono parametry tablicowe (Table Valued Parameters - TVP).

W SQL Serwerze 2008 wprowadzono parametry tablicowe (Table Valued Parameters - TVP). Procedury składowane c.d. Parametry tablicowe w Transact-SQL. W SQL Serwerze 2008 wprowadzono parametry tablicowe (Table Valued Parameters - TVP). Zadanie 1. Proszę napisad procedurę składowaną, która

Bardziej szczegółowo

CREATE DATABASE ksiegarnia_internetowa DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

CREATE DATABASE ksiegarnia_internetowa DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci; Zestaw ćwiczeń1 Dzięki DDL (Data Definition Language) można operować na strukturach, w których dane są przechowywane czyli np. dodawać, zmieniać i kasować tabele lub bazy. Najważniejsze polecenia tej grupy

Bardziej szczegółowo

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

Programowanie po stronie serwera w SZBD. Robert A. Kłopotek Wydział Matematyczno-Przyrodniczy. Szkoła Nauk Ścisłych, UKSW Programowanie po stronie serwera w SZBD Robert A. Kłopotek r.klopotek@uksw.edu.pl Wydział Matematyczno-Przyrodniczy. Szkoła Nauk Ścisłych, UKSW Programowanie SZBD (DBMS) Procedury serwera Procedury składowane

Bardziej szczegółowo

77. Modelowanie bazy danych rodzaje połączeń relacyjnych, pojęcie klucza obcego.

77. Modelowanie bazy danych rodzaje połączeń relacyjnych, pojęcie klucza obcego. 77. Modelowanie bazy danych rodzaje połączeń relacyjnych, pojęcie klucza obcego. Przy modelowaniu bazy danych możemy wyróżnić następujące typy połączeń relacyjnych: jeden do wielu, jeden do jednego, wiele

Bardziej szczegółowo

Fizyczna struktura bazy danych w SQL Serwerze

Fizyczna struktura bazy danych w SQL Serwerze Sposób przechowywania danych na dysku twardym komputera ma zasadnicze znaczenie dla wydajności całej bazy i jest powodem tworzenia między innymi indeksów. Fizyczna struktura bazy danych w SQL Serwerze

Bardziej szczegółowo

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

3 Przygotowali: mgr inż. Barbara Łukawska, mgr inż. Maciej Lasota Laboratorium nr 3 1 Bazy Danych Instrukcja laboratoryjna Temat: Wprowadzenie do języka SQL, tworzenie, modyfikacja, wypełnianie tabel 3 Przygotowali: mgr inż. Barbara Łukawska, mgr inż. Maciej Lasota 1)

Bardziej szczegółowo

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL. Prezentacja Danych i Multimedia II r Socjologia Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL. Celem ćwiczeń jest poznanie zasad tworzenia baz danych i zastosowania komend SQL. Ćwiczenie I. Logowanie

Bardziej szczegółowo

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny technologiczny Politechnika Śląska

Instytut Mechaniki i Inżynierii Obliczeniowej  Wydział Mechaniczny technologiczny Politechnika Śląska Instytut Mechaniki i Inżynierii Obliczeniowej www.imio.polsl.pl fb.com/imiopolsl @imiopolsl Wydział Mechaniczny technologiczny Politechnika Śląska Laboratorium 3 (Tworzenie bazy danych z użyciem UML, proste

Bardziej szczegółowo

Plan. Formularz i jego typy. Tworzenie formularza. Co to jest formularz? Typy formularzy Tworzenie prostego formularza Budowa prostego formularza

Plan. Formularz i jego typy. Tworzenie formularza. Co to jest formularz? Typy formularzy Tworzenie prostego formularza Budowa prostego formularza 4 Budowa prostych formularzy, stany sesji, tworzenie przycisków Plan Co to jest formularz? Typy formularzy Tworzenie prostego formularza Budowa prostego formularza 2 Formularz i jego typy Tworzenie formularza

Bardziej szczegółowo

Nowe technologie baz danych

Nowe technologie baz danych Nowe technologie baz danych Partycjonowanie Partycjonowanie jest fizycznym podziałem danych pomiędzy różne pliki bazy danych Partycjonować można tabele i indeksy bazy danych Użytkownik bazy danych nie

Bardziej szczegółowo

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

Procedury składowane. Funkcje vs. procedury Funkcja. Procedura. zazwyczaj ma parametry tylko typu IN; można wywoływać z poziomu Procedury składowane Kolejnym typem programu języka PL/SQL są procedury składowane. Procedury mogą posiadać parametry typu IN, OUT lub IN OUT. Umożliwiają wykonanie operacji na danych w bazie, mogą też

Bardziej szczegółowo

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

PL/SQL. Zaawansowane tematy PL/SQL. Piotr Medoń PL/SQL Zaawansowane tematy PL/SQL Piotr Medoń Cele Omówienie transakcji bazodanowych Omówienie obsługi wyjątków Zarządzanie perspektywami Tworzenie i usuwanie sekwencji Budowa wyzwalaczy 2 Transakcje bazodanowe

Bardziej szczegółowo

Język PL/SQL. Rozdział 6. Procedury wyzwalane

Język PL/SQL. Rozdział 6. Procedury wyzwalane Język PL/SQL. Rozdział 6. Procedury wyzwalane Procedury wyzwalane, cele stosowania, typy wyzwalaczy, wyzwalacze na poleceniach DML i DDL, wyzwalacze typu INSTEAD OF, przykłady zastosowania, zarządzanie

Bardziej szczegółowo

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

D D L S Q L. Co to jest DDL SQL i jakie s jego ą podstawowe polecenia? D D L S Q L Co to jest DDL SQL i jakie s jego ą podstawowe polecenia? D D L S Q L - p o d s t a w y DDL SQL (Data Definition Language) Jest to zbiór instrukcji i definicji danych, którym posługujemy się

Bardziej szczegółowo

Materiały do laboratorium MS ACCESS BASIC

Materiały do laboratorium MS ACCESS BASIC Materiały do laboratorium MS ACCESS BASIC Opracowała: Katarzyna Harężlak Access Basic jest językiem programowania wykorzystywanym w celu powiązania obiektów aplikacji w jeden spójny system. PROCEDURY I

Bardziej szczegółowo

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

SQL Server i T-SQL w mgnieniu oka : opanuj język zapytań w 10 minut dziennie / Ben Forta. Gliwice, Spis treści SQL Server i T-SQL w mgnieniu oka : opanuj język zapytań w 10 minut dziennie / Ben Forta. Gliwice, 2017 Spis treści O autorze 9 Wprowadzenie 11 Lekcja 1. Zrozumieć SQL 15 Podstawy baz danych 15 Język SQL

Bardziej szczegółowo