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 zmian w bazie danych, które należy albo wprowadzić wszystkie albo nie wprowadzać żadnej. Mechanizm transakcji zapewnia pozostawanie bazy w spójnym (poprawnym) stanie pomimo wystąpienia błędu gdziekolwiek w systemie (np. przerwa w zasilaniu) lub w samej transakcji. Reguła ACID opisuje, jakie cechy powinna mieć transakcja: Niepodzielna (Atomic) Spójna (Consistent) Odizolowana (Isolated) Trwała (Durable) Zarzadzanie transakcjami Wszystkie operacje na bazie danych realizowane są w postaci ciągu transakcji. Transakcyjność zapewnia bezpieczeństwo i stabilną pracę bazy danych. Wszystkie instrukcje w ramach jednej transakcji zostają wykonane w całości lub w całości zostają wycofane. Dzięki temu nie powstaje sytuacja, w której tylko część danych modyfikowanych w przerwanej transakcji zostaje zmieniona. Dane, które podlegają zmianie, są odizolowane od innych użytkowników i procesów pracujących na bazie danych do czasu zakończenia transakcji. Transakcja jest zatwierdzana i kończy się w chwili wykonania instrukcjicommit. Wówczas wszystkie modyfikacje danych zostają zapisane w bazie. Uwaga. W przypadku wykonania którejkolwiek z instrukcji należącej do grupy DDL (np. CREATE, ALTER, DROP) wykonywany jest niejawny COMMIT. Uwaga. Edytory SQL mają często ustawioną domyślnie opcję autocommit. Transakcje w takim wypadku zatwiedzane są bez wykonania przez nas instrukcji COMMIT, tylko automatycznie po wykonaniu każdej instrukcji SQL. InstrukcjaROLLBACK wycofuje wszystkie modyfikacje danych w ramach jednej transakcji. Możemy ją zastosować jeśli się np. pomylimy. Ta instrukcja nie zadziała, jeśli wcześniej wykonamy COMMIT. Transakcja w takim wypadku została już zakończona. InstrukcjaSAVEPOINT pozwala utworzyć punkty przywracania. W przypadku pomyłki możemy wrócić do miejsca zapisania SAVEPOINT bez straty tych instrukcji, które zostały wykonane przed nim, dzięki temu nie ma konieczności wykonywania wszystkich operacji od początku. Aby założyć nowy savepoint stosujemy: SAVEPOINT NAZWA_SAVEPOINTA; Aby przywrócić stan do określonego savepointa stosujemy: ROLLBACK TO NAZWA_SAVEPOINTA;
Instrukcja INSERT Najprostsza forma poleceniainsert. INSERT INTO NAZWA_TABELI VALUES (WARTOŚĆ1, WARTOŚĆ2); Przy powyższym musimy podać wartości dla wszystkich kolumn uzupełnianej tabeli. Jeśli chcemy dodać wartość tylko do niektórych kolumn musimy zastosować poniższą konstrukcję: INSERT INTO NAZWA_TABELI (NAZWA_KOLUMNY1, NAZWA_KOLUMNY2) VALUES (WARTOŚĆ1, WARTOŚĆ2); Insert danych pochodzących z zapytania. Do tabeli możemy dodać również wiele wierszy jednocześnie, pochodzących z innego zapytania. Warunkiem powodzenia jest zgodność ilości oraz typów kolumn w tabeli źródłowej i docelowej, np. INSERT INTO JOBS SELECT TEST.NEXTVAL, JOB_TITLE, MIN_SALARY, MAX_SALARY FROM JOBS; Usuwanie danych: DELETE i TRUNCATE Aby skasować wszystkie wiersze z tabeli stosujemy konstrukcję: DELETE FROM NAZWA_TABELI; Możemy też skasować tylko część wierszy z tabeli stosując WHERE, np. DELETE FROM NAZWA_TABELI WHERE ID=1000; Kasowanie danych TRUNCATE Tabelę można również wyczyścić całkowicie przy pomocy polecenia TRUNCATE, np. TRUNCATE TABLE JOBS; Nie możemy tutaj w przeciwieństwie do DELETE zastosować WHERE. Możemy wyczyścić tylko całość tabeli. Tej operacji nie da się odwrócić za pomoca instrukcjirollback. Modyfikowanie danych: UPDATE Podstawowa forma modyfikacji danych: UPDATE NAZWA_TABELI SET KOLUMNA=WARTOŚĆ; Możemy zmieniać wiele kolumn naraz dodając je po przecinku: UPDATE NAZWA_TABELI SET KOLUMNA=WARTOŚĆ, SET KOLUMNA2=WARTOŚĆ2; Również tutaj możemy zastosować WHERE: UPDATE NAZWA_TABELI SET KOLUMNA=WARTOŚĆ, SET KOLUMNA2=WARTOŚĆ2 WHERE KOLUMNA=WARTOŚĆ; Instrukcja MERGE InstrukcjaMERGE umożliwia scalenie danych z dwóch tabel, czyli np. zamianę części danych w jednej tabeli na dane z innej tabeli. Przykład: zbieranie opłat za gaz. W tabeligazownia zapisane są stany liczników z danego miasta. Inkasent zbiera dane na temat stanów liczników od klientów z jednego rejonu (dane te są zapisane w tabeliinkasent_1). Następnie trzeba uaktualnić stany liczników w głównej tabeli Gazownia na podstawie danych w tabeliinkasent_1. Stosując MERGE można to zrobić za pomocą jednej instrukcji, nie trzeba wprowadzać każdej zmiany osobną instrukcją UPDATE.
Instrukcja MERGE InstrukcjaMERGE umożliwia scalenie danych z dwóch tabel, czyli np. zamianę części danych w jednej tabeli na dane z innej tabeli. Przykład: zbieranie opłat za gaz. W tabeligazownia zapisane są stany liczników z danego miasta. Inkasent zbiera dane na temat stanów liczników od klientów z jednego rejonu (dane te są zapisane w tabeliinkasent_1). Następnie trzeba uaktualnić stany liczników w głównej tabeli Gazownia na podstawie danych w tabeliinkasent_1. Stosując MERGE można to zrobić za pomocą jednej instrukcji, nie trzeba wprowadzać każdej zmiany osobną instrukcją UPDATE. MERGE INTO Gazownia g USING Inkasent_1 i ON(g.nr_klienta=i.nr_klienta) WHEN MATCHED THEN UPDATE SET g.stan_licznika=i.stan_licznika; MERGE INTO Gazownia g USING Inkasent_1 i ON(g.nr_klienta=i.nr_klienta) WHEN MATCHED THEN UPDATE SET g.stan_licznika=i.stan_licznika; W klauzulimerge INTO podajemy nazwę tabeli, w której mamy zmienić dane (czyli tabelę docelową, tu:gazownia). PoUSING: podajemy tabelę (widok lub podzapytanie), z której chcemy pobrać dane do zmiany (czyli tabelę źródłową, tu: Inkasent_1). Warunek poon określa, jak mają być dopasowane wiersze w obu tabelach, czyli na podstawie którego wiersza w tabeliinkasent_1 ma zostać zaktualizowany wiersz w tabeligazownia. WHEN MATCHED THEN UPDATE określa, co ma zostać wykonane dla wierszy tabeli docelowej spełniających warunek z klauzuli ON. Przykład: zbieranie danych o wynikach wyborów. W tabeliwyniki zapisane są liczby głosów oddanych na poszczególne komitety wyborcze w kraju. Dane z komisji są zapisane w tabelikomisja_nr_1, należy zaktualizować dane w tabeli Wyniki na podstawie danych z komisji, jeżeli któryś z komitetów wyborczych nie był jeszcze uwzględniony w tabeli z wynikami, należy go do niej dodać. MERGE INTO Wyniki w USING Komisja_nr_1 k ON(w.nr_komitetu=k.nr_komitetu) WHEN MATCHED THEN UPDATE SET w.liczba_głosów=w.liczba_głosów+ k.liczba_głosów WHEN NOT MATCHED THEN INSERT (w.nr_komitetu, w.liczba_głosów) VALUES(k.nr_komitetu, k.liczba_głosów); MERGE INTO Wyniki w USING Komisja_nr_1 k ON(w.nr_komitetu=k.nr_komitetu) WHEN MATCHED THEN UPDATE SET w.liczba_głosów=w.liczba_głosów+ k.liczba_głosów WHEN NOT MATCHED THEN INSERT (w.nr_komitetu, w.liczba_głosów) VALUES(k.nr_komitetu, k.liczba_głosów); W klauzulimerge INTO podajemy nazwę tabeli, w której mamy zmienić dane (czyli tabelę docelową, tu:wyniki). PoUSING: podajemy tabelę, z której chcemy pobrać dane do zmiany (czyli tabelę źródłową, tu:komisja_nr_1). ON określa, jak mają być dopasowane wiersze w obu tabelach. WHEN MATCHED THEN UPDATE określa, co ma zostać wykonane dla wierszy tabeli docelowej spełniających warunek z klauzuli ON. WHEN NOT MATCHED THEN INSERT określa czynność, która ma nastąpić gdy warunek ON nie jest spełniony, czyli wstawienie nowych wierszy.
Widoki w Oracle Widok (inaczej perspektywa) umożliwia zapisanie kryteriów tworzących zapytanie a następnie odwołanie się do tego zapytania w dowolnej chwili, bez konieczności ponownego wpisywania całej instrukcji. Widok definiujemy w oparciu o dowolne zapytanie SELECT. Tworzenie widoku CREATE [OR REPLACE] [FORCE] VIEW nazwa [(lista nazw kolumn)] AS SELECT... (dowolne zapytanie SELECT) [WITH READ ONLY] [WITH CHECK OPTION] CREATE VIEW osoby AS SELECT first_name, last_name, salary, hire_date FROM employees; Widok usuwamy za pomocą instrukcji DROP. DROP VIEW nazwa; CREATE VIEW osoby AS SELECT first_name, last_name, salary, hire_date FROM employees; Można dodatkowo określić nazwy używanych kolumn. Listę nazw kolumn należy podać koniecznie, gdy jakiekolwiek dwie kolumny w zapytaniu mają takie same nazwy lub znajduje się w nim nienazwane (poprzez AS) wyrażenie, np. CREATE VIEW osoby1(imie_nazw, zarobki, data) AS SELECT first_name last_name, salary, hire_date FROM employees; Widok jest obiektem bazy danych traktowanym w zapytaniach jako tablica. Do widoku odwołujemy się jak do tabeli, np. SELECT * FROM osoby;
Widok jest obiektem bazy danych traktowanym w zapytaniach jako tablica. Do widoku odwołujemy się jak do tabeli, np. SELECT * FROM osoby; Uwaga. Widok nie jest kopią zbioru danych. Jest zapisanym w bazie zapytaniem SELECT. Za każdym razem, gdy odwołujemy się do widoku, uruchamiane jest definiujące go zapytanie i zwracane są aktualne dane. Możliwe jest stosowanie w zapytaniach odwołujących się do widoku klauzul WHERE, GROUP BY, HAVING, ORDER BY, podzapytań, złączeń, funkcji, itp. Można także stosować zagnieżdżanie widoków. Widok jest obiektem bazy danych traktowanym w zapytaniach jako tablica. Do widoku odwołujemy się jak do tabeli, np. SELECT * FROM osoby; Uwaga. Widok nie jest kopią zbioru danych. Jest zapisanym w bazie zapytaniem SELECT. Za każdym razem, gdy odwołujemy się do widoku, uruchamiane jest definiujące go zapytanie i zwracane są aktualne dane. Możliwe jest stosowanie w zapytaniach odwołujących się do widoku klauzul WHERE, GROUP BY, HAVING, ORDER BY, podzapytań, złączeń, funkcji, itp. Można także stosować zagnieżdżanie widoków. Widok może być zdefiniowany z użyciem pewnych opcji. Opcja OR REPLACE spowoduje, że jeżeli widok o takiej nazwie istniał, to zostanie nadpisany przez właśnie utworzony. Opcja FORCE wymusza stworzenie widoku, nawet jeżeli w danym momencie jest niepoprawny, np. odwołuje się do tabeli lub widoku, który jeszcze nie został stworzony. Klauzula WITH READ ONLY widok zdefiniowany z tą opcją nie jest modyfikowalny. Widoki zastosowania Widoki zastosowania 1. Wygoda użytkowników. Ułatwienie pracy poprzez utworzenie widoków zawierających często używane lub skomplikowane zapytania. 2. Możliwość prezentowania danych w takiej postaci, która odpowiada danemu użytkownikowi (można w ten sposób zmienić nazwy kolumn na bardziej czytelne dla użytkownika, przeprowadzić na danych pewne wstępne operacje, np. dane liczbowe można zaokrąglić do wymaganej dokładności, usunąć zbędne spacje, itp.). 3. Ukrywanie efektów normalizacji poprzez tworzenie widoków zawierających złączenia tabel. 4. Ograniczenie dostępu do danych. Zamiast nadać użytkownikowi uprawnienia do tabeli, można nadać uprawnienia do korzystania z widoków zawierających tylko te dane, które są potrzebne danemu użytkownikowi, np. dla danej tabeli można stworzyć widok zawierający tylko wybrane kolumny (lub wiersze) i w ten sposób ukryć pozostałe dane przed użytkownikiem. 5. Zapewnienie danym bezpieczeństwa. Widoki mogą być użyte do stworzenia warstwy abstrakcji pomiędzy użytkownikiem a tabelami bazowymi, w oparciu o które zostały zbudowane.
Widoki modyfikowalne w Oracle W zapytaniach SELECT widoki funkcjonują jak tabele. Dla pewnych widoków, zwanych modyfikowalnymi, dopuszczalne jest przeprowadzanie operacji na danych: INSERT, UPDATE i DELETE. Poprzez widoki modyfikowalne mamy możliwość zmiany danych w tabelach bazowych. Aby to było możliwe, każdemu wierszowi widoku musi odpowiadać dokładnie jeden wiersz w tabeli. Warunki, jakie musi spełniać widok modyfikowalny: 1. dane pochodzą z jednej tabeli; 2. nie zawiera klauzuli DISTINCT; 3. nie zawiera GROUP BY; 4. nie zawiera funkcji agregacji (na liście SELECT); 5. nie zawiera skorelowanego podzapytania; 6. nie został stworzony z klauzulą WITH READ ONLY; 7. nie jest oparty o inny widok niemodyfikowalny. Widoki modyfikowalne w Oracle Aby poprzez widok można było modyfikować dane z użyciem operacji INSERT lub UPDATE, to oprócz podanych wcześniej warunków, widok nie może zawierać wyrażenia na liście SELECT; aby można było wykonać INSERT na widoku, to każda kolumna NOT NULL bez wartości domyślnej w tabeli, o którą oparty jest widok, musi być w tym widoku odwzorowana. Widoki modyfikowalne w Oracle Aby poprzez widok można było modyfikować dane z użyciem operacji INSERT lub UPDATE, to oprócz podanych wcześniej warunków, widok nie może zawierać wyrażenia na liście SELECT; aby można było wykonać INSERT na widoku, to każda kolumna NOT NULL bez wartości domyślnej w tabeli, o którą oparty jest widok, musi być w tym widoku odwzorowana. Uwaga. Jeżeli wykonujemy operację INSERT na widoku modyfikowalnym, to do tych kolumn, które nie są wymienione w widoku, zostaną wpisane ich wartości domyślne (o ile są zdefiniowane), NULL w przeciwnym przypadku. Widoki modyfikowalne w Oracle Aby poprzez widok można było modyfikować dane z użyciem operacji INSERT lub UPDATE, to oprócz podanych wcześniej warunków, widok nie może zawierać wyrażenia na liście SELECT; aby można było wykonać INSERT na widoku, to każda kolumna NOT NULL bez wartości domyślnej w tabeli, o którą oparty jest widok, musi być w tym widoku odwzorowana. Uwaga. Jeżeli wykonujemy operację INSERT na widoku modyfikowalnym, to do tych kolumn, które nie są wymienione w widoku, zostaną wpisane ich wartości domyślne (o ile są zdefiniowane), NULL w przeciwnym przypadku. Przykład widoku modyfikowalnego: CREATE VIEW programisci AS SELECT employee_id, first_name, last_name, email, hire_date, job_id, salary FROM employees WHERE job_id= IT_PROG ;
Widoki modyfikowalne z klauzula WITH CHECK OPTION Widoki modyfikowalne z klauzula WITH CHECK OPTION Jeżeli widok modyfikowalny został utworzony z klauzulą CHECK, to nie można dodać ani zmienić danych w tym widoku w taki sposób, że dane te nie będą już w tym widoku widoczne. Jeżeli widok modyfikowalny został utworzony z klauzulą CHECK, to nie można dodać ani zmienić danych w tym widoku w taki sposób, że dane te nie będą już w tym widoku widoczne. Zdefiniujmy widokprogramisci z opcją CHECK. CREATE OR REPLACE VIEW programisci AS SELECT employee_id, first_name, last_name, email, hire_date, job_id, salary FROM employees WHERE job_id= IT_PROG WITH CHECK OPTION; Statusy VALID i INVALID widoków oraz innych obiektów bazy Poniższa instrukcja modyfikuje dane w widoku programiści, nie naruszając warunku z klauzuli WHERE: UPDATE programisci SET salary=salary*1.05; Poprawnie skompilowane obiekty bazy mają status VALID (właściwy). Każda zmianie obiektu (np. tabeli, widoku, procedury), jak np. usunięcie lub dodaniu pól do tabeli, usunięcie widoku, powoduje, że wszystkie obiekty zależne od tego obiektu, w tym widoki, ulegają dekompilacji. Otrzymują status INVALID (niewłaściwy).
Podstawowe typy danych w Oracle Tekstowe: VARCHAR2(size) : dane tekstowe zmiennej długości, maksymalna długość 4000 bytów. CHAR(size): dane tekstowe stałej długości, maksymalna długość 2000 bytów, jeżeli nie podamy, domyślnie 1. Liczbowe: NUMBER (p, s) : liczby stałoprzecinkowe, o precyzji p (oznacza ilość cyfr w całej liczbie) i skali s (ilość miejsc po przecinku). NUMBER(p): liczby całkowite, p z zakresu 1..38. NUMBER : liczba zmiennoprzecinkowa. Daty: DATE : data, zakres od 1.1.4712 pne, do 31.12.9999 ne, zawiera pola YEAR, MONTH, DAY, HOUR, MINUTE, SECOND. TIMESTAMP : data i godzina, z ułamkowymi częściami sekund, domyślnie z dokładnością do 6 miejsc po przecinku. Uwaga. Tworzenie stałych: za pomocądate 1998-12-25 (bez części odpowiadającej godzinie) lubto_date( 1998-12-25 17:30, YYYY-MM-DD HH24:MI )