SQL - język relacyjnych i obiektowo-relacyjnych baz danych Wykład 3 SQL - język relacyjnych i obiektowo-relacyjnych baz danych Zaawansowane cechy
Perspektywy – podstawa poziomów zewnętrznych bazy danych Zapamiętana w bazie danych definicja zapytania do późniejszego użycia: perspektywa jest “wirtualną” tabelą, można ją używać tak jak tabelę, jej wiersze nie są przechowywane w bazie danych, mogą być wyliczone na żądanie. CREATE VIEW Urzędnicy (Empno, Ename, Sal) AS SELECT Empno, Ename, Sal FROM Emp WHERE Job = 'CLERK';
Perspektywy c.d. Perspektywy służą do dostosowania bazy danych do potrzeb różnych grup użytkowników: stanowią “perspektywę” z jakiej dana klasa użytkowników “widzi” bazę danych; różne grupy użytkowników mogą mieć odmienne perspektywy na te same dane w bazie danych. Umożliwiają wykonywanie instrukcji SELECT, INSERT, DELETE i UPDATE jak na tabelach.
Przykład CREATE VIEW Prac_sprzedaży AS SELECT * FROM Emp WHERE Deptno= 20; Używając tej perspektywy możemy przeprowadzać modyfikację danych w odniesieniu do pracowników z działu numer 20 np. możemy podnieść ich zarobki Sal o 10%: UPDATE Prac_sprzedaży SET Sal = Sal * 1.1;
Ograniczenia w Standardzie SQL dla modyfikowalnych perspektyw w klauzuli SELECT nie ma DISTINCT, w klauzuli FROM jest tylko jedna nazwa tabeli lub jedna nazwa perspektywy - spełniająca definiowane kryteria, na liście SELECT są tylko nazwy kolumn, w klauzuli WHERE nie ma podzapytania, nie ma klauzul GROUP BY i HAVING. Punkty 1-5 stanowią warunek dostateczny na to, aby jednoznacznie był określony wiersz w tabeli, której dotyczy zmiana.
Modyfikowalne perspektywy zawierające złączenia (Oracle) W Oracle można dokonywać zmian tylko po stronie klucza obcego, np. w tabeli Emp ale nie Dept: CREATE VIEW PracD AS SELECT Empno, Ename, p.Deptno, Dname, Loc FROM Emp p, Dept d WHERE p.Deptno= d.Deptno; INSERT INTO PracD(Empno, Ename, Deptno) VALUES (5600, 'Nowiński',20); wstawia pracownika “Nowiński” do tabeli Emp ustalając jego numer działu na 20 (Dname i Loc są nieistotne przy wstawianiu).
Tworzenie perspektywy z opcją sprawdzania CREATE VIEW nazwa_perspektywy[(nazwa_kolumny,...)] AS podzapytanie WITH CHECK OPTION; Opcja WITH CHECK OPTION - przy INSERT i UPDATE następuje sprawdzenie, czy wstawiany bądź modyfikowany wiersz spełnia warunek określony w klauzuli WHERE: jeśli spełnia, operacja jest wykonywana; jeśli nie spełnia, operacja nie zostanie wykonana.
Przykład Perspektywa pracowników będących na urlopie bezpłatnym CREATE VIEW Emp_na_urlopie_bezpłatnym AS SELECT * FROM Emp WHERE Sal = 0 OR Sal IS NULL WITH CHECK OPTION; Poprzez tę perspektywę nie uda się zmiana wysokości zarobków pracownika o nazwisku ‘Kowalski’, jeśli jego Zarobki są równe 0 lub Null. UPDATE Emp_na_urlopie_bezpłatnym SET Sal = 10000 WHERE Ename = 'KOWALSKI';
Perspektywy tylko do odczytu Zabezpieczenie przed dokonywaniem zmian przez perspektywę. CREATE VIEW Pracownicy AS SELECT * FROM Emp WITH READ ONLY; Każdy uprawniony użytkownik: może oglądać dane o pracownikach, nie może wykonywać wstawiania, modyfikowania ani usuwania wierszy.
Podsumowanie perspektyw Umożliwiają realizację poziomów zewnętrznych bazy danych. Udostępnia się je konkretnym grupom użytkowników. Określają widok na bazę danych zaprojektowany dla tej grupy użytkowników. Ułatwia to użycie danych. Stanowi element ochrony przed niepowołanym lub nieprawidłowym dostępem do danych. Każdy użytkownik bazy danych ma dostęp tylko do danych dotyczących jego działalności w firmie.
Lokalne perspektywy (inline views) Możemy poprzedzić instrukcje SELECT, INSERT, DELETE i UPDATE klauzulą WITH, definiując lokalne perspektywy widoczne tylko w danej instrukcji SQL. WITH dept_costs AS ( SELECT department_name, SUM(salary) dept_total FROM employees e, departments d WHERE e.department_id = d.department_id GROUP BY department_name)), avg_cost AS ( SELECT SUM(dept_total)/COUNT(*) avg FROM dept_costs) SELECT * FROM dept_costs WHERE dept_total > (SELECT avg FROM avg_cost) ORDER BY department_name; DEPARTMENT_NAME DEPT_TOTAL ------------------------------ ---------- Sales 313800 Shipping 156400 Możliwe definicje rekurencyjne – definiowalna perspektywa lokalna może wystepowac po FROM w VIEW
Tworzenie synonimów nazw tabel i perspektyw W przypadku długich identyfikatorów obiektów (np. specyfikacje sieciowe) – własne synonimy. CREATE SYNONYM nazwa_synonimu FOR nazwa_tabeli_lub_perspektywy; CREATE SYNONYM Dept FOR Kadry.Dept@mojafirma.com.pl; DROP SYNONYM nazwa_synonimu; Wspomaga niezależność logiczną danych. Każdy poziom zewnętrzny może mieć swoje odrębne nazwy.
Transakcje Często elementarną operacją na bazie danych nie jest wcale pojedyncza instrukcja SQL, ale ciąg takich instrukcji, nazywany transakcją. Np. przelanie pieniędzy z jednego konta na drugie, jest elementarną operacją z punktu widzenia aplikacji bankowej. W SQL używamy w tym celu co najmniej dwóch instrukcji UPDATE: UPDATE Konta SET Saldo = Saldo – 1000 WHERE Id_klienta = 1001; UPDATE Konta SET Saldo = Saldo + 1000 WHERE Id_klienta = 9999;
Transakcje c.d. UPDATE Konta SET Saldo = Saldo – 1000 WHERE Id_klienta = 1001; UPDATE Konta SET Saldo = Saldo + 1000 WHERE Id_klienta = 9999; Załóżmy, że pierwsza instrukcja wykonała się, a druga nie może zostać wykonana na przykład z powodu tego, że 9999 jest błędnym identyfikatorem klienta albo z powodu awarii komputera. Z punktu widzenia aplikacji dane znalazły się w stanie niespójnym i pozostaje tylko jedna możliwość - wycofać wynik pierwszej instrukcji UPDATE. Do tego celu służy instrukcja ROLLBACK. COMMIT - zatwierdza zmiany w bazie danych bez możliwości późniejszego ich wycofania.
Zagnieżdżone wycofywanie transakcji do SAVEPOINT Wycofanie w tył części ostatnio wykonywanych instrukcji do punktu zachowania (savepoint): SAVEPOINT punkt; Instrukcja wycofania ma wtedy postać: ROLLBACK TO SAVEPOINT punkt;
Transakcje autonomiczne w Oracle .... DECLARE PRAGMA autonomous_transaction; BEGIN DELETE FROM Emp WHERE Emp.Job='GHOSTBUSTER'; COMMIT; END; ....... ROLLBACK;
Blokowanie dostępu do tabel (Oracle) Zakładane blokady na wierszach, na których są przeprowadzane operacje. Programista może sam założyć blokadę na tabelę ograniczając możliwości jej zmian przez innych użytkowników. LOCK TABLE nazwa_tabeli IN [SHARE|EXCLUSIVE] MODE [NOWAIT]; SHARE – tryb współdzielony - przeciwko zmianom dokonywanym przez kogokolwiek (wielu użytkowników może założyć taką blokadę jednocześnie), EXCLUSIVE - tryb wyłączny - przeciwko zmianom dokonywanym przez innych użytkowników, samemu można zmieniać (tylko jeden użytkownik może mieć założoną taką blokadę), NOWAIT - nie czekać gdy założona blokada. Zdjęcie blokady przez wykonanie COMMIT lub ROLLBACK.
Blokady W Oracle: każdy użytkownik - mający odpowiednie uprawnienia - może odczytywać zatwierdzone dane w tabeli, niezależnie od założonych blokad. W innych systemach tryb EXCLUSIVE uniemożliwia jednoczesne odczytywanie danych.
Klauzula FOR UPDATE W systemie Oracle jest możliwe założenie blokady na wiersze będące wynikiem zapytania: SELECT nazwa_kolumny . . . FOR UPDATE [NOWAIT]; Wykonanie COMMIT lub ROLLBACK kończy blokadę wskazanych wierszy.
Transakcje “tylko-odczyt” “Zamrożenie” widoku bazy danych do jej aktualnego stanu dla następnie wykonywanych instrukcji SELECT. Instrukcje SELECT korzystają ze “zdjęcia migawkowego” bazy danych wykonanego w tym momencie. Instrukcja SET TRANSACTION READ ONLY; musi być pierwszą instrukcją w transakcji – złożonej z ciągu instrukcji SELECT i LOCK TABLE. ''Odmrożenie'' widoku bazy danych następuje przez wykonanie polecenia COMMIT. Rozpoczęcie transakcji typu nie-READ ONLY (opcjonalne). SET TRANSACTION READ WRITE;
Współbieżne transakcje Niezatwierdzony odczyt danych (ang. dirty read, read uncommited) - transakcja odczytuje dane, które zmieniła inna transakcja ale ich nie zatwierdziła. Niepowtarzalny odczyt danych (ang. unreapetable read) - w ramach danej transakcji, widać zmiany wprowadzane przez inne zatwierdzone transakcje. Fantom - wiersz, którego nie było w tabeli na początku wykonywania danej transakcji, a który został wprowadzony przez inną zatwierdzoną transakcję w trakcie wykonywania danej transakcji.
Poziomy izolacji Poziom izolacji Niezatwierdzony odczyt Niepowtarzalny odczyt Fantomy Read Uncommited TAK Read Commited NIE Repeatable Reads Serializable
Ustawianie poziomu izolacji w SQL SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; ....... COMMIT; SET TRANSACTION ISOLATION LEVEL READ COMMITED; ....... COMMIT;
Katalog systemowy, słownik danych - informacja o obiektach bazy danych (Oracle) Ma postać zbioru tabel i perspektyw. z przedrostkiem User - informacja o wszystkich obiektach, których dany użytkownik jest właścicielem – tabele: User_Tables (Tabs), tabele i kolumny: User_Tab_Columns (Cols), więzy spójności: User_Constraints, User_Cons_Columns, indeksy: User_Indexes (Ind), User_Ind_Columns, synonimy: User_Synonyms (Syn), perspektywy: User_Views. z przedrostkiem All - dotyczy wszystkich obiektów do których użytkownik ma uprawnienia (np. All_Tables), z przedrostkiem Dba - informacja o obiektach dostępnych dla administratorów systemu (np. Dba_Users).
Przykłady SELECT Table_Name FROM User_Tables; -- Podobnie All_Tables wypisuje nazwy tabel, których właścicielem jest dany użytkownik. SELECT Column_Name, Data_Type FROM User_Tab_Columns WHERE Table_Name = 'EMP'; COLUMN_NAME DATA_TYPE ------------- ---------- EMPNO NUMBER ENAME VARCHAR2 JOB VARCHAR2 MGR NUMBER HIREDATE DATE SAL NUMBER COMM NUMBER DEPTNO NUMBER
Przyznawanie i odbieranie uprawnień w bazie danych GRANT uprawnienie, ... ON obiekt TO użytkownik, ...|PUBLIC [WITH GRANT OPTION] uprawnienie - rodzaj operacji, do jakiej użytkownik uzyskuje uprawnienie, np. SELECT, DELETE, INSERT, UPDATE, ALTER i EXECUTE; obiekt - tabela, perspektywa, … WITH GRANT OPTION - obdarowany użytkownik może uzyskane uprawnienia przekazywać innym użytkownikom; PUBLIC - przyznanie uprawnienia wszystkich użytkownikom.
Przykład Nadać księgowej uprawnienia dostępu do tabeli Emp w zakresie wykonywania instrukcji SELECT oraz również instrukcji UPDATE, ale tylko w odniesieniu do kolumny Sal. GRANT SELECT, UPDATE(Sal) ON Emp TO Księgowa;
Uprawnienia systemowe Np. CREATE TABLE, CREATE VIEW, CREATE SESSION (uprawnienie do logowania się do bazy danych). Administrator bazy danych Oracle tworzy konto użytkownika za pomocą instrukcji: CREATE USER użytkownik IDENTIFIED BY hasło; GRANT CREATE SESSION, CREATE TABLE TO użytkownik; DROP USER użytkownik [CASCADE]; CASCADE - system usuwa użytkownika razem ze wszystkimi jego obiektami.
REVOKE Uprawnienia odwołuje się za pomocą instrukcji odwrotnej do instrukcji GRANT. REVOKE uprawnienie, ... ON nazwa_obiektu FROM użytkownik, ...|PUBLIC;
Role W celu ułatwienia przyznawania uprawnień dużej liczbie użytkowników zostało wprowadzone pojęcie roli tzn. powiązania grupy użytkowników ze zbiorem uprawnień. Z jednej strony konkretnym użytkownikom przyznaje się uprawnienie do danej roli (przyznając im tę rolę). Z drugiej strony roli przyznaje się konkretne uprawnienia do wykonywania operacji w bazie danych.
Przykład Utwórz role Dyrektora i Urzędnika, przydziel im uprawnienia i zalicz do nich konkretnych użytkowników: CREATE ROLE Dyrektor; CREATE ROLE Urzędnik; GRANT SELECT ON Emp TO Dyrektor; GRANT SELECT, UPDATE ON Emp TO Urzędnik; GRANT Dyrektor TO King, Leon; GRANT Urzędnik TO Liza, Ewa, Marta;
Role zdefiniowane przez System CONNECT - zawierająca uprawnienie CREATE SESSION, RESOURCE - uprawnienia do tworzenia obiektów, DBA - uprawnienia do wykonywania funkcji administratora systemu. Przy tworzeniu konta nowego użytkownika przydziela się mu się najczęściej role: CONNECT i RESOURCE – umożliwiające pełne korzystanie z instrukcji SQL na swoim koncie.
Schemat Schemat tworzy grupę powiązanych obiektów. CREATE SCHEMA nazwa_schematu ciąg instrukcji CREATE TABLE, CREATE VIEW i GRANT (bez rozdzielających średników); Ciąg składowych instrukcji jest realizowany jako transakcja: albo są wykonywane wszystkie instrukcje albo żadna. W instrukcjach składowych mogą być odwołania cykliczne REFERENCES między tabelami.
Schemat, katalog, klaster, schemat informacyjny W Standardzie nie występuje w sposób jawny pojęcie bazy danych. Katalog - zbiór schematów. Schemat ma jednego właściciela. W skład katalogu mogą wchodzić schematy mające różnych właścicieli. Klaster - zbiór katalogów. Klaster może być traktowany jako rozproszona baza danych składająca się ze zbioru katalogów, do których użytkownik ma dostęp w ramach jednej sesji. Dla każdego katalogu powinien być określony jeden schemat nazywany schematem informacyjnym pełniący rolę słownika danych dla całego katalogu.
Sesja i połączenia Zarówno w Standardzie jak i w Oracle istnieją możliwości zmiany ustawień dla danej sesji użytkownika. W Standardzie z każdą sesją jest związany zbiór połączeń z różnymi bazami danych, z których tylko jedno jest aktywne. Stosowane są następujące polecenia: uzyskiwanie nowego połączenia CONNECT TO nazwa_serwera; zmiana istniejącego połączenia SET CONNECTION nazwa_serwera; rozłączenie połączenia DISCONNECT nazwa_serwera;
ALTER SESSION Niektóre własności sesji mogą być zmieniane w trakcie połączenia. W Oracle zmiany wprowadza się za pomocą instrukcji ALTER SESSION, na przykład: ALTER SESSION ISOLATION LEVEL SERIALIZABLE; powoduje ustawienie poziomu izolacji transakcji w sesji na SERIALIZABLE.
Dziedziny (domeny) (Standard) Zdefiniujmy dziedzinę numerów departamentów: CREATE DOMAIN Dept# CHAR(3) CHECK (VALUE IN ('A00','B01','D01','D11','D21', 'XXX')) DEFAULT 'XXX'; Następnie, możemy jej użyć przy określaniu typu danych kolumn w tabelach: CREATE TABLE Dept (DeptNo DOMAIN Dept# PRIMARY KEY, ...);
Asercje (Standard) Więzy spójności definiowane poza instrukcjami CREATE TABLE i ALTER TABLE dotyczące całej tabeli. CREATE ASSERTION maxempl CHECK (1000 <= SELECT COUNT (*) FROM Emp); DROP ASSERTION nazwa_asercji;
Tabele tymczasowe Są częścią schematu bazy danych - ich zawartość jest niszczona: przy każdym zakończeniu sesji użytkownika (ON COMMIT PRESERVE ROWS), przy każdej operacji COMMIT (opcja ON COMMIT DELETE ROWS). CREATE GLOBAL TEMPORARY TABLE Prac_zatrudniani_dziś (Nr_kolejny INTEGER PRIMARY KEY, Imię VARCHAR(40) NOT NULL, Nazwisko VARCHAR(50) NOT NULL, Informacja VARCHAR(1000)) ON COMMIT PRESERVE ROWS;
Tabele chwilowe SELECT MAX(p.NumEmp) maxNE, MAX(p.AvgSal) maxSA FROM (SELECT Deptno, Count(Empno) NumEmp, Avg(Sal) AvgSal FROM Emp GROUP BY Deptno )p;
Rodzaje tabel trwałe - przechowywane na stałe w bazie danych, objęte mechanizmami wycofywania zmian i odtwarzania po awarii; tymczasowe - przechowywane na czas sesji lub transakcji, objęte tylko mechanizmem wycofywania zmian; chwilowe - wyliczane i przechowywane na czas realizacji jednego zapytania.
Generowanie jednoznacznych numerów (Oracle) Sekwencja - przechowywana w bazie danych - służy do generowania jednoznacznych numerów dla wartości kluczy głównych. CREATE SEQUENCE nazwa_sekwencji [INCREMENT BY k] [START WITH n]; gdzie n jest pierwszą generowaną liczbą naturalną, a k jest wartością, o jaką wzrasta kolejno generowany numer. nazwa_sekwencji.NextVal - generowanie kolejnej wartości w sekwencji, nazwa_sekwencji.CurrVal - ostatnio wygenerowana wartość w sekwencji (w ramach aktualnej sesji).
Przykład Utwórz dwie sekwencje generujące jednoznaczne numery dla działów i dla pracowników. CREATE SEQUENCE Dept_seq INCREMENT BY 10 START WITH 10; CREATE SEQUENCE Emp_seq INCREMENT BY 1 START WITH 1000;
Przykład INSERT INTO Dept(Deptno, Dname, Loc) VALUES (Dept_seq.NextVal, 'Sprzedaż', 'Warszawa'); Oto instrukcja tworząca kolejnego pracownika, z wykorzystaniem wygenerowanego przed chwilą, numeru działu: INSERT INTO Emp VALUES (Emp_seq.NextVal, 'Stec', 'MANAGER', NULL, '20-JAN-90', 10000, 0, Dept_seq.CurrVal);
Klaster (Oracle) Struktura fizycznego przechowywania danych, w której kilka tabel jest zebranych razem według wartości wspólnej kolumny (kolumn) - lub wartości funkcji haszującej. Umożliwia szybsze dokonywanie złączeń tabel wchodzących w skład klastra. Najpierw tworzy się klaster, następnie tabele w klastrze i w końcu indeks klastra. Dopiero w tym momencie można rozpocząć wstawianie wierszy do tabel w klastrze. Przykład klastra dla tabel Dept i Emp. Indeksem klastra, względem którego gromadzone są obok siebie na dysku wiersze tych tabel, jest numer działu. Razem jest trzymany wiersz opisujący dział jak i wiersze pracowników przypisanych do tego działu.
Przykład CREATE CLUSTER Personnel (Department_number NUMBER(2)); CREATE TABLE Dept (Deptno NUMBER(2) PRIMARY KEY, Dname VARCHAR2(9), Loc VARCHAR2(9)) CLUSTER Personnel (Deptno); CREATE TABLE Emp (Empno NUMBER PRIMARY KEY, Ename VARCHAR2(10) NOT NULL, Job VARCHAR2(9), Mgr NUMBER REFERENCES Emp(Empno), Hiredate DATE, Sal NUMBER(10,2), Comm NUMBER(9,0), Deptno NUMBER(2)NOT NULL REFERENCES Dept(Deptno)) CREATE INDEX Idx_personnel ON CLUSTER Personnel;
Wyzwalacze bazy danych Procedury: wiązane z jednym z obiektów: tabelą, perspektywą, ze schematem (kontem użytkownika), całą bazą danych; wywoływane (odpalane) przez system przy zajściu odpowiedniego zdarzenia, które może być albo zdarzeniem systemowym albo jedną z instrukcji INSERT, DELETE lub UPDATE skierowaną do wykonania na tabeli lub perspektywie w bazie danych. Wyzwalacze bazy danych służą głównie do programowania więzów spójności i do programowania stałych czynności, które powinny być wykonywane w każdej aplikacji korzystającej z bazy danych.
Wyzwalacze tabelowe Dla każdej tabeli można określić 12 typów wyzwalaczy (dla jednej tabeli może być więcej niż jeden wyzwalacz jednego typu). Typ wyzwalacza: czy dotyczy operacji na pojedynczym wierszu (wyzwalacz wierszowy) czy dotyczy wykonania całej instrukcji czy ma być wykonywany przed operacją (typ BEFORE) czy po (typ AFTER) może dotyczyć każdej z trzech instrukcji INSERT, DELETE i UPDATE.
Wyzwalacze typu INSTEAD OF Realizacja postulatu modyfikowania za pomocą perspektyw. CREATE [OR REPLACE] TRIGGER nazwa_wyzwalacza INSTEAD OF specyfikacja_instrukcji ON perspektywa blok_PL/SQL gdzie specyfikacja_instrukcji – ciąg do trzech nazw INSERT, DELETE i UPDATE połączonych spójnikiem OR
Przykład CREATE OR REPLACE VIEW Ale AS SELECT e.Ename, e.Empno, d.Dname, d.Deptno FROM Emp e, Dept d WHERE e.Deptno = d.Deptno;
CREATE OR REPLACE TRIGGER Ale_insert INSTEAD OF INSERT ON Ale FOR EACH ROW DECLARE p NUMBER; BEGIN SELECT Count(*) INTO p FROM Dept WHERE Deptno = :NEW.Deptno; IF p=0 THEN INSERT INTO Dept(Deptno,Dname) VALUES(:NEW.Deptno, :NEW.Dname); ELSE UPDATE Dept SET Dname=:NEW.Dname WHERE Deptno=:NEW.Deptno; END IF; SELECT Count(*) INTO p FROM Emp WHERE Empno = :NEW.Empno; INSERT INTO Emp(Empno,Ename,Deptno) VALUES(:NEW.Empno, :NEW.Ename, :NEW.Deptno); UPDATE Emp SET Ename = :NEW.Ename END;
Wyzwalacze systemowe CREATE [OR REPLACE] TRIGGER nazwa_wyzwalacza [BEFORE|AFTER|INSTEAD OF] [zdarzenie_bazodanowe|zdarzenie_DDL] ON [DATABASE|SCHEMA] blok_PL/SQL gdzie zdarzenie_bazodanowe: SERVERERROR, LOGON, LOGOFF, STARTUP lub SHUTDOWN, zdarzenie_DDL to nazwa instrukcji DDL a więc na przykład: CREATE, ALTER, DROP, GRANT, REVOKE.
Dynamiczny SQL Gdy w chwili kompilacji nie znamy pełnej postaci instrukcji SQL w tym instrukcji DDL. Szczegóły mogą być ustalane w trakcie działania programu, jak np. z której tabeli wyświetlić wiersze lub którą tabelę usunąć.
Naturalny dynamiczny SQL (PL/SQL) EXECUTE IMMEDIATE instrukcja_SQL [USING lista_parametrów_wiązania]; Zmienne kursorowe: OPEN cursor FOR sql_stmt [USING lista_parametrów_wiązania];
Przykład 1 DECLARE sql_stmt VARCHAR2(100); my_deptno NUMBER(2) := 50; my_dname VARCHAR2(15) := 'PERSON'; my_loc VARCHAR2(15) := 'DALLAS'; emp_rec emp%ROWTYPE; BEGIN sql_stmt := 'INSERT INTO Dept VALUES (:1, :2, :3)'; EXECUTE IMMEDIATE sql_stmt USING my_deptno, my_dname, my_loc; sql_stmt := 'SELECT * FROM Emp WHERE Empno = :id'; EXECUTE IMMEDIATE sql_stmt INTO emp_rec USING 7788; EXECUTE IMMEDIATE 'DELETE FROM Dept WHERE Deptno = :n' USING my_deptno; EXECUTE IMMEDIATE 'CREATE TABLE Bonus (Id NUMBER, Am NUMBER)'; END; plsql_block VARCHAR2(200);
Przykład 2 - SELECT DECLARE TYPE EmpCurTyp IS REF CURSOR; emp_cv EmpCurTyp; emp_rec emp%ROWTYPE; sql_stmt VARCHAR2(100); my_job VARCHAR2(15) := 'CLERK'; BEGIN sql_stmt := 'SELECT * FROM Emp WHERE Job = :j'; OPEN emp_cv FOR sql_stmt USING my_job; LOOP FETCH emp_cv INTO emp_rec; EXIT WHEN emp_cv%NOTFOUND; ... -- process record END LOOP; CLOSE emp_cv; END; Dynamiczny kursor
Zapytania retrospektywne – flashback queries Możliwość wyświetlania danych według stanu bazy danych z przeszłości. Ograniczone możliwością odtworzenia danych przy użyciu dziennika wycofań – miejsca w nim są cyklicznie nadpisywane. Przydatne przy analizie danych. Przydatne gdy błędnie wprowadziliśmy, zmieniliśmy lub usunęliśmy dane.
Przykład AS OF Timestamp(Sysdate-1/24); Wyświetl dane z przed godziny SELECT * FROM Emp AS OF Timestamp(Sysdate-1/24);