ORACLE Sekwencje Sekwencje - przykład Sekwencje

Transkrypt

ORACLE Sekwencje Sekwencje - przykład Sekwencje
Sekwencje
ORACLE
(Wykład 4)
CREATE SEQUENCE nazwa_sekwencji
ś
Sekwencje
Tworzenie pakietów
Wyzwalacze
ś
ć
ś
ś
Sekwencje - przykład
CREATE SEQUENCE sekw_2
INCREMENT BY 2
START WITH 100
MAXVALUE 120
CYCLE;
ć
[ INCREMENT BY warto
| START WITH warto
| {MAXVALUE warto | NOMAXVALUE}
| {MINVALUE warto | NOMINVALUE }
| {CYCLE | NOCYCLE } ]
ć
ć
Sekwencje - przykład
BEGIN
FOR i IN 1..5 LOOP
INSERT INTO komunikat(nr)
VALUES(sekw_2.NEXTVAL);
END LOOP;
END;
Sekwencje
Sekwencje
• Mog by u ywane:
ą
ALTER SEQUENCE nazwa_sekwencji
ć
Ŝ
– w klauzuli SET polecenia UPDATE
– najbardziej zewn trznym podzapytaniu
– w listach warto ci polecenia INSERT
ę
ś
ś
ć
[ INCREMENT BY warto
| {MAXVALUE warto | NOMAXVALUE}
| {MINVALUE warto | NOMINVALUE }
| {CYCLE | NOCYCLE } ]
ś
ś
ć
ć
• Nie mog by u ywane:
ą
ć
Ŝ
– w podzapytaniach
– w poleceniu SELECT z klauzulami ORDER
BY, GROUP BY, CONNECT BY, HAVING
– z kwantyfikatorem DISTINCT
1
Synonimy
Synonimy - przyklad
CREATE [PUBLIC] SYNONYM
nazwa_synonimu FOR obiekt;
CREATE PUBLIC SYNONYM
s_ksiazka FOR ksiazka;
Synonimy prywatne: tworzone dla okre lonej
grupy u ytkowników
ś
Ŝ
Synonimy publiczne: tworzone dla wszystkich
u ytkowników
RENAME stara_nazwa TO nowa_nazwa;
Ŝ
Pakiety
Specyfikacja pakietu
Baza danych
Aplikacja
Pakiet
Specyfikacja
Ciało pakietu
Tworzenie ciała pakietu
CREATE [ OR REPLACE ]
PACKAGE BODY nazwa_pakietu AS
deklaracje prywatne
definicje podprogramów
[ BEGIN
instrukcje inicjalizuj ce pakietu]
END;
ą
CREATE [OR REPLACE]
PACKAGE nazwa_pakietu AS
deklaracje publiczne
specyfikacje podprogramów
END;
Pakiety - przykład
CREATE OR REPLACE
PACKAGE pak_zamowienia AS
PROCEDURE usun_zamowienie
(v_id zamowienie.id_zamowienia%TYPE);
PROCEDURE dodaj_pozycje
(v_id zamowienie.id_zamowienia%TYPE,
v_isbn ksiazka.isbn%TYPE,
v_ilosc zamowiona_ksiazka.ilosc%TYPE);
END;
2
Pakiety - przykład
CREATE PACKAGE BODY pak_zamowienia AS
PROCEDURE usun_zamowienie
(v_id zamowienie.id_zamowienia%TYPE)
IS
BEGIN
DELETE FROM zamowiona_ksiazka
WHERE id_zamowienia = v_id;
DELETE FROM zamowienie
WHERE id_zamowienia = v_id;
END;
Pakiety - przykład
PROCEDURE dodaj_pozycje
(v_id zamowienie.id_zamowienia%TYPE,
v_isbn ksiazka.isbn%TYPE,
v_ilosc zamowiona_ksiazka.ilosc%TYPE);
IS
BEGIN
INSERT INTO zamowiona_ksiazka
VALUES(v_id, v_isbn, SYSDATE, v_ilosc);
END;
END; -- koniec pakietu
Pakiety - przykład
Pakiety - zalety korzystania
EXECUTE pak_zamowienia.usun_zamownienie(5);
• Poprawa zarz dzania procedurami i
funkcjami
• Poprawa bezpiecze stwa (uprawnienia
do pakietu!)
• Poprawa efektywno ci
ą
ń
EXECUTE pak_zamowienia.dodaj_pozycje(,,,);
ś
Pakiety wbudowane
DBMS_ALERT
DBMS_OUTPUT
DBMS_PIPE
UTL_FILE
UTL_HTTP
DBMS_SQL
DBMS_DEBUG
DBMS_DDL
DBMS _RANDOM
DBMS_SESSION
SET SERVEROUTPUT ON
Tworzenie wyzwalaczy
CREATE OR REPLACE
TRIGGER nazwa_wyzwalacza
{ BEFORE | AFTER | INSTEAD OF }
{ DELETE | INSERT | UPDATE
[ OF kolumna, [, kolumna ] … ] }
[ OR { DELETE | INSERT | UPDATE
[ OF kolumna, [, kolumna ] … ] } ]
ON tabela
[ FOR EACH ROW [ WHEN (warunek) ] ]
blok pl/sql
3
Stare i nowe warto ci wierszy
Modyfikowanie warto ci
INSERT
new
UPDATE
new, old
BEFORE
Mo na zmienia warto ci “new”
DELETE
old
AFTER
Nie mo na zmienia warto ci “new”
ć
Ŝ
Ŝ
ś
ć
ś
:identyfikator.kolumna
Tworzenie wyzwalaczy przykład
CREATE OR REPLACE TRIGGER trig_wydawca
BEFORE UPDATE OF id_wydawcy ON wydawca
FOR EACH ROW
BEGIN
UPDATE ksiazka
SET wydawca = :new.id_wydawcy
WHERE wydawca = :old.id_wydawcy;
END;
Wyzwalacz INSTEAD OF
CREATE VIEW p_wydawcy
AS SELECT isbn, tytul, nazwa
FROM ksiazka, wydawca
WHERE ksiazka.wydawca=wydawca.id_wydawcy;
Tworzenie wyzwalaczy przykład
UPDATE wadawca
SET id_wydawcy = 4
WHERE id_wydawcy = 5;
Wyzwalacz INSTEAD OF
CREATE OR REPLACE TRIGGER trig_wydawcy
INSTEAD OF INSERT ON p_wydawcy
DECLARE
v_id_wydawcy wydawca.id_wydawcy%TYPE;
BEGIN
SELECT id_wydawcy INTO v_id_wydawcy
FROM wydawca
WHERE nazwa = :new.nazwa;
INSERT INTO ksiazka (isbn, tytul, wydawca)
VALUES (:new.isbn,:new.tytul,v_id_wydawcy);
END;
4
Wł czanie i wył czanie
wyzwalaczy
Rodzaje wyzwalaczy
• Wyzwalacze reaguj ce
ą
ALTER TRIGGER nazwa_wyzwalacza
{ ENABLE | DISABLE}
– na instrukcje DML: BEFORE, AFTER
(operuj na tabelach)
– INSTEAD OF (operuj na perspektywach)
ą
ą
• Wyzwalacze przeprowadzaj ce akcje
po wykonaniu polecenia, które
aktywizuje wyzwalacz
ą
ALTER TRIGGER nazwa_wyzw ENABLE;
ALTER TRIGGER nazwa_wyzw DISABLE;
Wyzwalacze systemowe
BEFORE LOGON
BEFORE CREATE
BEFORE ALTER
BEFORE DROP
BEFORE AUDIT
BEFORE NOAUDIT
BEFORE DDL
BEFORE GRANT
BEFORE RENAME
BEFORE REVOKE
AFTER LOGON
AFTER CREATE
AFTER ALTER
AFTER DROP
AFTER AUDIT
AFTER NOAUDIT
AFTER DDL
AFTER GRANT
AFTER RENAME
AFTER REVOKE
Wykrywanie rodzaju instrukcji
DML
Polecenie-1 DML
Wyzwalacz
Polecenie-2 DML
INSERTING
UPDATING
DELETING
Wyzwalacze systemowe
CREATE OR REPLACE
TRIGGER trig_logowanie
AFTER LOGON
ON SCHEMA
BEGIN
INSERT INTO komunikat(str1)
VALUES(‘zalogowano sie’ || SYSDATE);
END;
Wykrywanie rodzaju instrukcji
DML
CREATE OR REPLACE
TRIGGER trig_ceny
BEFORE INSERT OR UPDATE OF
cena ON ksiazka
FOR EACH ROW
WHEN (new.cena < 100)
DECLARE
v_akcja VARCHAR2(20);
…..
5
Przykład - cd.
BEGIN
IF :new.cena > :old.cena*1.1 THEN
:new.cena := :old.cena*1.1;
END IF;
IF INSERTING THEN
v_akcja := ‘wstawiono wiersz’;
ELSE
v_akcja := ‘zaktualizowano wiersz’;
END IF;
INSERT INTO komunikat
VALUES(‘ksiazka’, SYSDATE, v_akcja);
END;
Usuwanie obiektów bazy
danych
DROP SEQUENCE nazwa_sekwencji;
DROP [PUBLIC] SYNONYM nazwa_synonimu;
DROP PACKAGE nazwa_pakietu;
DROP TRIGGER nazwa_wyzwalacza;
6