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

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

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

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

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

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

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

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

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

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

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

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

Wstęp wprowadzający do laboratorium 2. mgr inż. Rafał Grycuk

Wstęp wprowadzający do laboratorium 2. mgr inż. Rafał Grycuk Wstęp wprowadzający do laboratorium 2 mgr inż. Rafał Grycuk Plan prezentacji 1. Czym jest T-SQL i czym się różni od standardu SQL 2. Typy zapytań 3. Zapytanie typu SELECT 4. Słowo o indeksach T-SQL (1)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ć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

Bazy danych. Dr inż. Paweł Kasprowski

Bazy danych. Dr inż. Paweł Kasprowski Plan wykładu Bazy danych Podstawy relacyjnego modelu danych Dr inż. Paweł Kasprowski pawel@kasprowski.pl Relacyjne bazy danych Język SQL Zapytania SQL (polecenie select) Bezpieczeństwo danych Integralność

Bardziej szczegółowo

Bazy danych 10. SQL Widoki

Bazy danych 10. SQL Widoki Bazy danych 10. SQL Widoki P. F. Góra http://th-www.if.uj.edu.pl/zfs/gora/ semestr letni 2005/06 Widoki, AKA Perspektywy W SQL tabela, która utworzono za pomoca zapytania CREATE TABLE, nazywa się tabela

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

Zarządzanie obiektami bazy danych Oracle11g

Zarządzanie obiektami bazy danych Oracle11g Zarządzanie obiektami bazy danych Oracle11g Wstęp Obiekty to struktury przechowujące, porządkujące lub operujące na danych takie jak: Tabele Więzy integralności Indeksy Widoki Sekwencje Procedury Linki

Bardziej szczegółowo

SQL :: Data Definition Language

SQL :: Data Definition Language SQL :: Data Definition Language 1. Zaproponuj wydajną strukturę danych tabela) do przechowywania macierzy o dowolnych wymiarach w bazie danych. Propozycja struktury powinna zostać zapisana z wykorzystaniem

Bardziej szczegółowo

BAZY DANYCH PROJEKT. Tomasz Osmelak, 258441 Wrocław, 26.01.2014 Instytut Matematyczny Wydział Matematyki I Informatyki Uniwersytet Wrocławski

BAZY DANYCH PROJEKT. Tomasz Osmelak, 258441 Wrocław, 26.01.2014 Instytut Matematyczny Wydział Matematyki I Informatyki Uniwersytet Wrocławski Tomasz Osmelak, 258441 Wrocław, 26.01.2014 Instytut Matematyczny Wydział Matematyki I Informatyki Uniwersytet Wrocławski BAZY DANYCH PROJEKT Sprawdzający: dr hab. Robert Stańczy 1 Spis treści: 1. Schemat

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

UPDATE Studenci SET Rok = Rok + 1 WHERE Rodzaj_studiow =' INŻ_ST'; UPDATE Studenci SET Rok = Rok 1 WHERE Nr_albumu IN ( '111345','100678');

UPDATE Studenci SET Rok = Rok + 1 WHERE Rodzaj_studiow =' INŻ_ST'; UPDATE Studenci SET Rok = Rok 1 WHERE Nr_albumu IN ( '111345','100678'); polecenie UPDATE służy do aktualizacji zawartości wierszy tabel lub perspektyw składnia: UPDATE { } SET { { = DEFAULT NULL}, {

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

Zbiór pytań nr 2. 1 Tabela DEPARTMENTS ma następującą strukturę:

Zbiór pytań nr 2. 1 Tabela DEPARTMENTS ma następującą strukturę: Zbiór pytań nr 2 1 Tabela DEPARTMENTS ma następującą strukturę: Nazwa kolumny Typ danych Uwagi dept_id NUMBER(4) NOT NULL, PRIMARY KEY dept_name VARCHAR2(30) mgr_id NUMBER(6) location_id NUMBER(4) Które

Bardziej szczegółowo

Instrukcja do programu Przypominacz 1.6

Instrukcja do programu Przypominacz 1.6 Instrukcja do programu Przypominacz 1.6 Program Przypominacz 1.6 pozwala w prosty sposób wykorzystać dane z systemu sprzedaży Subiekt GT do prowadzenia tzw. miękkiej windykacji poprzez wysyłanie kontrahentom

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

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

Język DML. Instrukcje DML w różnych implementacjach SQL są bardzo podobne. Podstawowymi instrukcjami DML są: SELECT INSERT UPDATE DELETE

Język DML. Instrukcje DML w różnych implementacjach SQL są bardzo podobne. Podstawowymi instrukcjami DML są: SELECT INSERT UPDATE DELETE Język DML Instrukcje DML w różnych implementacjach SQL są bardzo podobne. Podstawowymi instrukcjami DML są: SELECT INSERT UPDATE DELETE Systemy Baz Danych, Hanna Kleban 1 INSERT Instrukcja INSERT dodawanie

Bardziej szczegółowo

BAZY DANYCH Cz III. Transakcje, Triggery

BAZY DANYCH Cz III. Transakcje, Triggery BAZY DANYCH Cz III Transakcje, Triggery Transakcje Definicja: Zbiór operacji (modyfikacja danych, usuwanie, wstawianie, tworzenie obiektów bazodanowych), które albo wszystkie kończone są sukcesem, albo

Bardziej szczegółowo

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

w PL/SQL bloki nazwane to: funkcje, procedury, pakiety, wyzwalacze w PL/SQL bloki nazwane to: funkcje, procedury, pakiety, wyzwalacze Cechy bloków nazwanych: w postaci skompilowanej trwale przechowywane na serwerze wraz z danymi wykonywane na żądanie użytkownika lub w

Bardziej szczegółowo

Instrukcja do programu Przypominacz 1.5

Instrukcja do programu Przypominacz 1.5 Instrukcja do programu Przypominacz 1.5 Program Przypominacz 1.5 pozwala w prosty sposób wykorzystać dane z systemu sprzedaży Subiekt GT do prowadzenia tzw. miękkiej windykacji poprzez wysyłanie kontrahentom

Bardziej szczegółowo

Przydatne sztuczki - sql. Na przykładzie postgres a.

Przydatne sztuczki - sql. Na przykładzie postgres a. Przydatne sztuczki - sql. Na przykładzie postgres a. M. Wiewiórko 05/2014 Plan Uwagi wstępne Przykład Rozwiązanie Tabela testowa Plan prezentacji: Kilka uwag wstępnych. Operacje na typach tekstowych. Korzystanie

Bardziej szczegółowo

Imię i Nazwisko Data Ocena. Laboratorium 7

Imię i Nazwisko Data Ocena. Laboratorium 7 Imię i Nazwisko Data Ocena Laboratorium 7 Celem tego ćwiczenia jest pokazanie, że w MoscowML można pisać aplikacje użytkowe, np. prosty interpreter języka SQL (MLSQL) Listy i krotki Różnica pomiędzy krotkami

Bardziej szczegółowo

Bazy danych dla producenta mebli tapicerowanych. Bartosz Janiak Marcin Sikora Wrocław 9.06.2015 r.

Bazy danych dla producenta mebli tapicerowanych. Bartosz Janiak Marcin Sikora Wrocław 9.06.2015 r. Bazy danych dla producenta mebli tapicerowanych Bartosz Janiak Marcin Sikora Wrocław 9.06.2015 r. Założenia Stworzyć system bazodanowy dla małej firmy produkującej meble tapicerowane. Projekt ma umożliwić

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 4 Wsady Procedury składowane Procedury składowane tymczasowe, startowe Zmienne tabelowe Funkcje

Bardziej szczegółowo

kończy wysyłanie danych do pliku tworzy strukturę tabeli wyświetla opis struktury tabeli zmiana nazwy tabeli usuwanie tabeli

kończy wysyłanie danych do pliku tworzy strukturę tabeli wyświetla opis struktury tabeli zmiana nazwy tabeli usuwanie tabeli SPOOL moj_plik SPOOL OFF @ moj_ plik edit CREATE TABLE DESCRIBE ALTER TABLE RENAME DROP TABLE CONNECT CONNECT USER_NAME DISCONNECT EXIT zapisuje wszystkie wydane polecenia oraz ich wyniki do pliku moj_plik,

Bardziej szczegółowo

Część 1: OLAP. Raport z zajęć laboratoryjnych w ramach przedmiotu Hurtownie i eksploracja danych

Część 1: OLAP. Raport z zajęć laboratoryjnych w ramach przedmiotu Hurtownie i eksploracja danych Łukasz Przywarty 171018 Wrocław, 05.12.2012 r. Grupa: CZW/N 10:00-13:00 Raport z zajęć laboratoryjnych w ramach przedmiotu Hurtownie i eksploracja danych Część 1: OLAP Prowadzący: dr inż. Henryk Maciejewski

Bardziej szczegółowo

Zadania z SQLa (MS SQL Server)

Zadania z SQLa (MS SQL Server) Zadania z SQLa (MS SQL Server) Struktura testowej bazy danych (diagram ERD): opracował dr Robert Fidytek SPIS TYPÓW ZADAŃ 1 Projekcja wyników zapytań (SELECT FROM )... 3 2 Sortowanie wyników zapytań (ORDER

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

Monika Sychla 241858 Daniel Smolarek 241875. Projekt bazy danych

Monika Sychla 241858 Daniel Smolarek 241875. Projekt bazy danych Monika Sychla 241858 Daniel Smolarek 241875 Projekt bazy danych Naszym zadaniem było zaprojektowanie przykładowej bazy danych, w oparciu o zagadnienia jakie zostały wprowadzone w trakcie kursu z baz danych.

Bardziej szczegółowo

Język zapytań SQL- język relacyjnych baz danych

Język zapytań SQL- język relacyjnych baz danych Język SQL Język zapytań SQL- język relacyjnych baz danych SQL (Structured Query Language),czyli Strukturalny Język Zapytań. SQL jest standardowym językiem do kierowania poleceń do relacyjnej bazy danych

Bardziej szczegółowo

- język zapytań służący do zapisywania wyrażeń relacji, modyfikacji relacji, tworzenia relacji

- język zapytań służący do zapisywania wyrażeń relacji, modyfikacji relacji, tworzenia relacji 6. Język SQL Język SQL (Structured Query Language): - język zapytań służący do zapisywania wyrażeń relacji, modyfikacji relacji, tworzenia relacji - stworzony w IBM w latach 70-tych DML (Data Manipulation

Bardziej szczegółowo

4. Projekt Bazy Danych

4. Projekt Bazy Danych 4. Projekt Bazy Danych 4.1. Opis rozdziału W tym rozdziale przedstawiono prosty projekt bazy danych dla naszej gry. 4.2. Dane logowania Na początku zastanówmy się jakie dane będą nam potrzebne do zarejestrowania

Bardziej szczegółowo

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

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych Języki programowania wysokiego poziomu PHP cz.4. Bazy danych PHP i bazy danych PHP może zostać rozszerzony o mechanizmy dostępu do różnych baz danych: MySQL moduł mysql albo jego nowsza wersja mysqli (moduł

Bardziej szczegółowo

1 Zaznacz poprawne stwierdzenia dotyczące grup plików (filegroup) możemy określić do której grupy plików trafi

1 Zaznacz poprawne stwierdzenia dotyczące grup plików (filegroup) możemy określić do której grupy plików trafi 1 Zaznacz poprawne stwierdzenia dotyczące grup plików (filegroup) Tworząc tabelę nie możemy określić, do którego pliku trafi, lecz możemy określić do której grupy plików trafi Zawsze istnieje grupa zawierająca

Bardziej szczegółowo

QUERY język zapytań do tworzenia raportów w AS/400

QUERY język zapytań do tworzenia raportów w AS/400 QUERY język zapytań do tworzenia raportów w AS/400 Dariusz Bober Katedra Informatyki Politechniki Lubelskiej Streszczenie: W artykule przedstawiony został język QUERY, standardowe narzędzie pracy administratora

Bardziej szczegółowo

Uprawnienia, role, synonimy

Uprawnienia, role, synonimy Uprawnienia, role, synonimy Schemat, użytkownicy, autoryzacja użytkowników, uprawnienia systemowe i obiektowe, nadawanie i odbieranie uprawnień, tworzenie ról, przywileje, synonimy Schematy i użytkownicy

Bardziej szczegółowo

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre) Uwagi dotyczące notacji kodu! Wyrazy drukiem prostym -- słowami języka VBA. Wyrazy drukiem pochyłym -- inne fragmenty kodu. Wyrazy w [nawiasach kwadratowych] opcjonalne fragmenty kodu (mogą być, ale nie

Bardziej szczegółowo

SYSTEM INFORMATYCZNY KS-SEW

SYSTEM INFORMATYCZNY KS-SEW DOKUMENTACJA TECHNICZNA KAMSOFT S.A. 40-235 Katowice ul. 1-Maja 133 Tel. (032) 2090705, Fax. (032) 2090715 http:www.kamsoft.pl, e-mail: 5420@kamsoft.pl SYSTEM INFORMATYCZNY NR KATALOGOWY 2334PI06.00 WYDANIE

Bardziej szczegółowo

Microsoft SQL Server Podstawy T-SQL

Microsoft SQL Server Podstawy T-SQL Itzik Ben-Gan Microsoft SQL Server Podstawy T-SQL 2012 przełożył Leszek Biolik APN Promise, Warszawa 2012 Spis treści Przedmowa.... xiii Wprowadzenie... xv Podziękowania... xix 1 Podstawy zapytań i programowania

Bardziej szczegółowo

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

I. Język manipulowania danymi - DML (Data Manipulation Language). Polecenia INSERT, UPDATE, DELETE Wykład 9 Implementacja języka SQL w systemach baz danych Oracle manipulowanie danymi (DML), tworzenie, modyfikowanie i usuwanie obiektów bazy danych: tabel i perspektyw, więzów integralności, komentarzy

Bardziej szczegółowo

W tej części zajmiemy się ćwiczeniami dotyczącymi modyfikacji rekordów.

W tej części zajmiemy się ćwiczeniami dotyczącymi modyfikacji rekordów. W tej części zajmiemy się ćwiczeniami dotyczącymi modyfikacji rekordów. Logujemy się do bazy danych (jak pamiętamy, słuŝy do tego oprogramowanie klienta, czyli programik mysql). ZałóŜmy sobie przede wszystkim

Bardziej szczegółowo

Bazy danych. Plan wykładu. Diagramy ER. Podstawy modeli relacyjnych. Podstawy modeli relacyjnych. Podstawy modeli relacyjnych

Bazy danych. Plan wykładu. Diagramy ER. Podstawy modeli relacyjnych. Podstawy modeli relacyjnych. Podstawy modeli relacyjnych Plan wykładu Bazy danych Wykład 9: Przechodzenie od diagramów E/R do modelu relacyjnego. Definiowanie perspektyw. Diagramy E/R - powtórzenie Relacyjne bazy danych Od diagramów E/R do relacji SQL - perspektywy

Bardziej szczegółowo

Kiedy i czy konieczne?

Kiedy i czy konieczne? Bazy Danych Kiedy i czy konieczne? Zastanów się: czy często wykonujesz te same czynności? czy wielokrotnie musisz tworzyć i wypełniać dokumenty do siebie podobne (faktury, oferty, raporty itp.) czy ciągle

Bardziej szczegółowo

Tworzenie raportów XML Publisher przy użyciu Data Templates

Tworzenie raportów XML Publisher przy użyciu Data Templates Tworzenie raportów XML Publisher przy użyciu Data Templates Wykorzystanie Szablonów Danych (ang. Data templates) jest to jedna z metod tworzenia raportów w technologii XML Publisher bez użycia narzędzia

Bardziej szczegółowo

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

Bazy danych wykład dwunasty PL/SQL, c.d. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, wykładwarszawa) Bazy danych wykład dwunasty PL/SQL, c.d. Konrad Zdanowski Uniwersytet Kardynała Stefana Wyszyńskiego, Warszawa dwunasty PL/SQL, c.d. 1 / 37 SQL to za mało SQL brakuje możliwości dostępnych w językach proceduralnych.

Bardziej szczegółowo

Modelowanie hierarchicznych struktur w relacyjnych bazach danych

Modelowanie hierarchicznych struktur w relacyjnych bazach danych Modelowanie hierarchicznych struktur w relacyjnych bazach danych Wiktor Warmus (wiktorwarmus@gmail.com) Kamil Witecki (kamil@witecki.net.pl) 5 maja 2010 Motywacje Teoria relacyjnych baz danych Do czego

Bardziej szczegółowo

Przestrzenne bazy danych Podstawy języka SQL

Przestrzenne bazy danych Podstawy języka SQL Przestrzenne bazy danych Podstawy języka SQL Stanisława Porzycka-Strzelczyk porzycka@agh.edu.pl home.agh.edu.pl/~porzycka Konsultacje: wtorek godzina 16-17, p. 350 A (budynek A0) 1 SQL Język SQL (ang.structured

Bardziej szczegółowo

Projektowanie bazy danych. Jarosław Kuchta Projektowanie Aplikacji Internetowych

Projektowanie bazy danych. Jarosław Kuchta Projektowanie Aplikacji Internetowych Projektowanie bazy danych Jarosław Kuchta Projektowanie Aplikacji Internetowych Możliwości projektowe Relacyjna baza danych Obiektowa baza danych Relacyjno-obiektowa baza danych Inne rozwiązanie (np. XML)

Bardziej szczegółowo

Programowanie w SQL. definicja bloku instrukcji BEGIN...END, warunkowe wykonanie instrukcji IF...ELSE, wyrażenie CASE,

Programowanie w SQL. definicja bloku instrukcji BEGIN...END, warunkowe wykonanie instrukcji IF...ELSE, wyrażenie CASE, Programowanie w SQL definicja bloku instrukcji BEGIN...END, warunkowe wykonanie instrukcji IF...ELSE, wyrażenie CASE, kontynuacja działania od instrukcji za podaną etykietą GOTO etykieta, wyjście bezwarunkowe

Bardziej szczegółowo

Program Lojalnościowy by CTI. Instalacja

Program Lojalnościowy by CTI. Instalacja Program Lojalnościowy by CTI Instalacja Spis treści 1. Wstęp...3 2. Instalacja skryptów...4 2.1. Tabele...4 2.1.1. Tabela dbo.prlkonfiguracja...5 2.1.2. Tabela dbo.prlmarki...5 2.1.3. Tabela dbo.prlpunkty...5

Bardziej szczegółowo

Wykład 2. SQL 1 Structured Query Lenguage

Wykład 2. SQL 1 Structured Query Lenguage Wykład 2 SQL 1 Structured Query Lenguage SQL (Structured Query Language) Język zapytań do bazy danych. IBM lata osiemdziesiąte. Stosowany w systemach zarządzania bazami danych (DBMS); Oracle, Paradox,Access,

Bardziej szczegółowo

Przelewy24 Wirtualny Koszyk

Przelewy24 Wirtualny Koszyk Przelewy24 Wirtualny Koszyk Dialcom24 Sp. z o.o. wersja.1.1 data 2013-12-18 Spis treści: 1. Opis usługi 2 2. Obsługa interfejsu w panelu Przelewy24 2 2.1. Moduł konfiguracyjny 2 a) Dostawcy 2 b) Produkty

Bardziej szczegółowo

Konspekt zajęć dotyczących kwerend

Konspekt zajęć dotyczących kwerend Konspekt zajęć dotyczących kwerend Kwerendy służą wyszukiwaniu danych w sposób wiele elastyczniejszy niż przy użyciu samych tylko tabel. Można powiedzieć, że są one specjalną nakładką na tabele pozwalającą

Bardziej szczegółowo

Wyzwalacze TWORZENIE WYZWALACZY

Wyzwalacze TWORZENIE WYZWALACZY Wyzwalacze: podobnie jak procedury i funkcje, są nazwanymi blokami PL/SQL zawierającymi sekcje deklaracji, wykonania i obsługi wyjątków; nie akceptują argumentów; muszą być składowane jako samodzielne

Bardziej szczegółowo

Baza danych Ogrodu Zoologicznego

Baza danych Ogrodu Zoologicznego Baza danych Ogrodu Zoologicznego Sprawozdanie z realizacji projektu Marcin Gwózdek Spis treści I.Założenia projektowe...3 II.Diagram ERD...4 III.Diagram RSMD...5 IV.Skrypty SQL...7 1.Zoo.tab...7 2.Zoo.ind...9

Bardziej szczegółowo

Baza danych hotel Maciej Gerus 258583

Baza danych hotel Maciej Gerus 258583 Baza danych hotel Maciej Gerus 258583 Baza ta składa się z 7 tabel (jak widać na rysunku) i pozwala wirtualnie zapisywać (oraz analizować) niektóre uproszczone elementy pracy przedsiębiorstwa oferującego

Bardziej szczegółowo

z przedmiotu: Techniki Informatyczne Stanisław Flaga (stanislaw.flaga@agh.edu.pl)

z przedmiotu: Techniki Informatyczne Stanisław Flaga (stanislaw.flaga@agh.edu.pl) mysql relacyjna baza danych wstęp Materiały pomocnicze do laboratorium z przedmiotu: Techniki Informatyczne Stanisław Flaga () Wydział Inżynierii Mechanicznej i Robotyki Katedra Automatyzacji Procesów

Bardziej szczegółowo

Instrukcja do programu DoUPS 1.0

Instrukcja do programu DoUPS 1.0 Instrukcja do programu DoUPS 1.0 Program DoUPS 1.0 pozwala w prosty sposób wykorzystać dane z systemu sprzedaży Subiekt GT do generowania listów przewozowych dla firmy kurierskiej UPS w połączeniu z bezpłatnym

Bardziej szczegółowo