PROJEKT: [ FIRMA TURYSTYCZNA
|
|
- Krystyna Maciejewska
- 8 lat temu
- Przeglądów:
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 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ółowoInstrukcja 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ółowoPlan 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ółowo1: 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ółowoBAZA 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ółowoProcedury 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ółowoWykł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ółowoBlaski 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ółowoE.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ółowoPrzykł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ółowoWyzwalacz - 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ółowoCele. 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ółowoWykł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ółowoKowalski 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ółowoAspekty 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ółowoPrzykł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ółowoHurtownia Ś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ółowoBazy 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ółowoKOLEKCJE - 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ółowoJę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ółowoAdministracja 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ółowoWykł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ółowoOracle 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ółowoLAB 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ółowoPRZESTRZENNE 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ółowoZaawansowane 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ółowoRozdział 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ółowoPaweł 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ółowoPodstawy 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ółowoPawel@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ółowoWykł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ółowoBazy 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ółowoOracle11g: 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ółowo15. 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ółowoPrzykł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ółowoBazy 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ółowoLaboratorium 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ółowoWprowadzenie 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ółowoSystemy 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ółowoSQL 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ółowoINTERNETOWE 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ółowoStruktura 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ółowoDECLARE 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ółowoJę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ółowoBazy 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ółowoRelacyjne 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ółowoJę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ółowoBartosz 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ółowo1. 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ółowoSELECT * 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ółowoBazy 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ółowoSystemy 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ółowoSkł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ółowoZarzadzanie 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ółowoBazy 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ółowoPodstawy 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ółowoWprowadzenie 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ółowoTworzenie 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ółowo1. 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ółowoSQL (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ółowoProjektowanie 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ółowoJę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ółowoBazy 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ółowoProgramowanie 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ółowoRef. 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ółowoopisuje 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ółowoPerspektywy 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ółowoBloki 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ółowokoledzy, 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ółowoInż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ółowostrukturalny 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ółowoBazy 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ółowoBazy 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ółowoProgramowanie 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ółowoBaza 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ółowoUż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ółowoFunkcje 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ółowoJę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ółowoInstytut 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ółowoPODSTAWY 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ółowoInstytut 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ółowoPawel@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ółowoTworzenie 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ółowoW 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ółowoCREATE 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ółowoProgramowanie 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ółowo77. 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ółowoFizyczna 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ółowo3 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.
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ółowoInstytut 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ółowoPlan. 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ółowoNowe 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ółowoProcedury 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ółowoPL/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ółowoJę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ółowoD 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ółowoMateriał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ółowoSQL 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