BAZY DANYCH II WYKŁAD 7 Plan wykładu Pakiety Zalety pakietów

Transkrypt

BAZY DANYCH II WYKŁAD 7 Plan wykładu Pakiety Zalety pakietów
2011-01-13
Plan wykładu





BAZY DANYCH II
WYKŁAD 7


Pakiety: specyfikacja, ciało,
Wywoływanie elementów pakietów,
Przeciążanie podprogramów z pakietów,
Inicjowanie pakietów,
Deklaracje uprzedzające,
Funkcje pakietowe w SQL,
Pakiety wbudowane,
dr inż. Agnieszka Bołtuć
Pakiety




Pozwala na przechowywanie powiązanych ze
sobą obiektów w jednym miejscu,
Zazwyczaj posiada dwie odrębne części:
specyfikację i ciało, które są oddzielnie
przechowywane w słowniku danych,
Nie mogą być lokalne, a muszą być składowane w
bazie danych,
W pakiecie mogą znajdować się te same
elementy co w sekcji deklaracji w bloku:
procedury, funkcje, kursory, typy i zmienne oraz
wyjątki
Zalety pakietów




Enkapsulacja powiązanych obiektów,
Grupowanie logicznej funkcjonalności,
Łatwe projektowanie aplikacji: kodowanie i
kompilacja oddzielnie specyfikacji i ciała,
Ukrywanie informacji: tylko deklaracje w
specyfikacji są jawne i dostępne dla aplikacji,
prywatne deklaracje w ciele pakietu są ukryte,
kod jest ukryty w ciele pakietu,
1
2011-01-13
Zalety pakietów



Zwiększenie wydajności, w związku z
jednokrotnym ładowaniem do pamięci i
dostępnością tej kopii dla wszystkich
użytkowników,
Dodatkowa funkcjonalność związana z faktem,
że pakiety udostępniają zmienne globalne,
Umożliwiają przeładowanie procedur i funkcji.
Pakiety
Specyfikacja
pakietu
Deklaracja zmiennych
Deklaracja procedury lub funkcji
publiczne
itd.
Ciało pakietu
Deklaracja zmiennych
Definicja procedury lub funkcji
prywatne
itd.
Specyfikacja pakietu





Zwana tez nagłówkiem pakietu,
Jest to interfejs do aplikacji,
Zawiera informacje o zawartości pakietu, ale
bez kodu podprogramów,
Może zawierać deklarację publicznych typów,
zmiennych, stałych, wyjątków, kursorów,
W specyfikacji pakietu obowiązują te same
zasady co w sekcji deklaracji bloku
anonimowego,
Specyfikacja pakietu
CREATE [OR REPLACE] PACKAGE nazwa IS|AS
deklaracja publicznych typów i zmiennych
specyfikacja podprogramów
END [nazwa];
PROCEDURE nazwa_p (p_1 NUMBER);
FUNCTION nazwa_f (p_2 NUMBER) RETURN NUMBER;


Można inicjalizować zmienne, inaczej dostają one wartość
NULL,
Wszystkie konstrukcje zdeklarowane w specyfikacji pakietu
są publicznie dostępne dla wszystkich użytkowników, którzy
mają prawo do pakietu,
2
2011-01-13
Szczegóły deklaracji procedur i
funkcji



Kolejność deklaracji w pakiecie jest dowolna,
ale elementy które są używane w kodzie
musza być przed nim zdeklarowane,
Nie koniecznie pakiet musi zawierać
deklaracje wszystkich rodzajów elementów,
Deklaracja w części specyfikacyjnej to tzw.
deklaracja uprzedzająca – jest to opis
programu, bez kodu.
Ciało pakietu




Odrębny obiekt słownika danych,
Zawiera kody deklaracji uprzedzających z
nagłówka pakietu,
Mogą zawierać dodatkowe deklaracje
dostępne w ciele, ale niewidoczne w
specyfikacji: typy, zmienne, kursory, wyjątki,
Zdeklarowane elementy są widoczne tylko w
danym ciele pakietu,
Przykład specyfikacji pakietu
CREATE OR REPLACE PACKAGE socjalny IS
pomoc NUMBER :=1;
PROCEDURE inc (p_id employees.employee_id%TYPE);
PROCEDURE del (p_id employees.employee_id%TYPE);
END;
Ciało pakietu



Ciało pakietu jest opcjonalne, jeśli w nagłówku
pakietu nie mamy deklaracji procedur i funkcji to
ciało nie jest potrzebne,
Stworzenie samego nagłówka pakietu przydaje
się przy deklaracji typów i zmiennych globalnych,
Każda deklaracja z nagłówka musi mieć
odzwierciedlenie w ciele, specyfikacja procedur i
funkcji w obu częściach pakietu musi być taka
sama jeśli chodzi o nazwę, nazwy parametrów i
ich tryby,
3
2011-01-13
Tworzenie ciała pakietu
Przykład ciała pakietu
CREATE [OR REPLACE] PACKAGE
BODYnazwa IS|AS
deklaracja prywatnych typów i zmiennych
ciała podprogramów
END [nazwa];
CREATE OR REPLACE PACKAGE BODY socjalny IS
PROCEDURE inc (p_id employees.employee_id%TYPE) IS
v_sal employees.salary%type;
BEGIN
SELECT salary INTO v_sal FROM employees WHERE
employee_id=p_id;
v_sal:=v_sal*1.2;
UPDATE employees SET salary=v_sal
WHERE employee_id=p_id;
END inc;
…
Przykład ciała pakietu
Tworzenie pakietów – SQL
Developer
…
PROCEDURE del (p_id employees.employee_id%TYPE) IS
v_sal employees.salary%type;
BEGIN
SELECT salary INTO v_sal FROM employees WHERE
employee_id=p_id;
IF salary<200 THEN
DELETE FROM employees
WHERE employee_id=p_id;
END IF;
END inc;
END socjalny;
Okno programu SQL Developer
4
2011-01-13
Tworzenie ciał pakietów – SQL
Developer
Wywoływanie pakietów

BEGIN
socjalny.inc(100);
END;

EXECUTE socjalny.inc(200);

EXECUTE nazwa.socjalny.inc(300);
Okno programu SQL Developer
Wywoływanie pakietów – Oracle
SQL Developer
Pakiety bez ciała – definiowanie
zmiennych i stałych globalnych
CREATE OR REPLACE PACKAGE wart IS
c_pi CONSTANT NUMBER :=3.14159;
c_e CONSTANT NUMBER :=2.7182818;
END;
 BEGIN
DBMS_OUTPUT.PUT_LINE(’Pole koła równa
się’ || wart.c_pi*r*r);
END;

Okno programu SQL Developer
5
2011-01-13
Podgląd pakietów
Wskazówki do pisania pakietów
Specyfikacja pakietu
SELECT text FROM user_source
WHERE name= ’nazwa’ AND type=’PACKAGE’;

Ciało pakietu
SELECT text FROM user_source
WHERE name= ’nazwa’ AND type=’PACKAGE
BODY’;



Przeciążanie podprogramów z
pakietów



W pakiecie mogą znajdować się funkcje lub
procedury o takiej samej nazwie, ale wersjach
z różnymi parametrami,
Pozwala to na stosowanie tych samych
operacji do różnych typów obiektów,
Parametry muszą się różnić w liczbie,
kolejności lub typie,


Twórz pakiety do jak najbardziej ogólnego
użytku,
Umieszczaj w specyfikacji te elementy, które
mogą być publiczne,
Te które mają być wykorzystane lokalnie
definiuj w ciele pakietu,
Jeśli chcesz utworzyć pakiet bez funkcji i
procedur stwórz tylko jego specyfikację.
Ograniczenia przeciążania
Nie można utworzyć dwóch podprogramów jeśli
parametry różnią się tylko nazwą lub trybem:
PROCEDURE A (p_1 IN NUMBER);
PROCEDURE A (p_1 OUT NUMBER);

Nie można utworzyć dwóch funkcji jeśli różnią się
tylko typem zwracanej wartości,
FUNCTION B RETURN NUMBER;
FUNCTION B RETURN DATE;

6
2011-01-13
Ograniczenia przeciążania
Przykład przeciążania
Parametry podprogramów muszą należeć do
różnych rodzin typów:
PROCEDURE C (p_1 IN CHAR);
PROCEDURE C (p_1 IN VARCHAR2);
CREATE OR REPLACE PACKAGE prze IS


W Oracle 10g można przeciążać podprogramy
jeśli ich parametry różnią się tylko liczbowym
typem danych, np. BINARY_FLOAT i
BINARY_DOUBLE.
PROCEDURE dod (p_1 NUMBER, p_2
departments.department_name%type :=’abc’);
PROCEDURE dod (p_2
departments.department_name%type :=’abc’);
END;
Przykład przeciążania
Inicjowanie pakietów
CREATE OR REPLACE PACKAGE BODY prze IS
PROCEDURE dod (p_1 NUMBER, p_2
departments.departmen_name%type :=’abc’) IS
BEGIN
INSERT INTO departments (department_id, department_name)
VALUES (p_1, p_2);
END;
PROCEDURE dod (p_2 departments.departmen_name%type :=’abc’)
IS
BEGIN
INSERT INTO departments (department_id, department_name)
VALUES (departments_seq.NEXTVAL, p_2);
END;
END;




Przy pierwszym wywołaniu programu z pakietu
lub użyciu jego zmiennej, typu pakiet jest
inicjowany,
System wczytuje pakiet z dysku do pamięci i
uruchamia kod wywołanego elementu,
Pamięć jest przydzielana dla wszystkich
zmiennych pakietu,
Za inicjalizację odpowiada kod tzw. sekcji
inicjowania, znajdującej się na samym końcu
ciała pakietu.
7
2011-01-13
Inicjowanie pakietów

CREATE OR REPLACE PACKAGE BODY
nazwa IS
…
BEGIN
kod_inicjujący;
END;
Deklaracje uprzedzające



Nie można używać identyfikatorów przed ich
deklaracją, musi być zachowana kolejność,
Można temu zapobiec stosując deklaracje
uprzedzające,
Technika używana także w specyfikacji
pakietu,
Inicjowanie pakietów - przykład
CREATE OR REPLACE PACKAGE zm IS
v_pom NUMBER;
…
END;
CREATE OR REPLACE PACKAGE BODY zm IS
…
BEGIN
SELECT salary INTO v_pom FROM employees
WHERE employee_id=100;
END;
Deklaracje uprzedzające - przykład
CREATE OR REPLACE PACKAGE BODY dek IS
PROCEDURE A () IS
BEGIN
B();
END;
PROCEDURE B () IS
BEGIN
…
END;
END;
8
2011-01-13
Deklaracje uprzedzające - przykład
Funkcje pakietowe w SQL
CREATE OR REPLACE PACKAGE BODY dek IS
PROCEDURE B();

PROCEDURE A () IS
BEGIN
B();
END;

Funkcje pakietowe mogą być wywoływane w
zapytaniach SQL,
SELECT salary, nazwa.funkcja(argument)
FROM employees WHERE employee_id=10;
PROCEDURE B () IS
BEGIN
…
END;
END;
Funkcje pakietowe w SQL

RESTRICT_REFERENCES
Musze jednak spełniać określone
ograniczenia:

W instrukcji SELECT nie może modyfikować
żadnych tabel bazy,
 W instrukcji DML nie może kierować zapytań do
tabel związanych z danym poleceniem ani
modyfikować ich,
 W zapytaniu lub poleceniu DML nie może
zawierać żadnych instrukcji do kontroli transakcji,
sesji ani systemu,



Dyrektywa służąca do sprawdzania poziomów
ograniczeń funkcji,
Wykrywa niezgodności z ograniczeniami już w
trakcie kompilacji i zgłasza błędy,
Określane są tzw. poziomy czystości: WNDS –
funkcja nie modyfikuje żadnych tabel bazy danych
(używając DML), RNDS –funkcja nie wczytuje
żadnych tabel bazy (używając SELECT), WNPS –
funkcja nie modyfikuje żadnych zmiennych
pakietu, RNPS – funkcja nie sprawdza wartości
żadnych zmiennych pakietu,
9
2011-01-13
RESTRICT_REFERENCES
Pakiety wbudowane
PRAGMA RESTRICT_REFERENCES
(nazwa_podprogramu_lub_pakietu,
[WNDS][, WNPS][, RNDS][, RNPS] [TRUST]);


Umieszczamy ją w specyfikacji pakietu wraz z
deklaracją funkcji lub procedury,
 TRUST – oznacza że ograniczenia
wymienione w dyrektywie nie będą wymuszane.
Zwiększenie funkcjonalności bazy danych i
rozwiązywania złożonych problemów,
 Pozwalają na dostęp do niektórych własności
SQL które są normalnie dla PL/SQL niedostępne,


Przegląd pakietów wbudowanych



DBMS_ALERT - zapewnia synchroniczny,
transakcyjny mechanizm powiadamiania o
wystąpieniu określonego zdarzenia w bazie
danych pomiędzy sesjami (przed Oracle 8i),
DBMS_AQ - pakiet zawiera zbiór programów
pozwalających tworzyć, zarządzać i usuwać
kolejki i tabele kolejek w Oracle (przed Oracle 8i),
DBMS_DDL -zawiera programy pozwalające na
rekompilację kodu procedur magazynowanych,
analizę i wyliczanie statystyk dla obiektów bazy
danych oraz modyfikację wzajemnych zależności
obiektów w systemie Oracle (przed Oracle 8i),
Pakiety wbudowane to pakiety udostępniane
przez Oracle mające na celu:

Najczęściej są tworzone za pomocą skryptu
catproc.sql.
Przegląd pakietów wbudowanych




DBMS_DESCRIBE – udostępnia informacje o
parametrach procedur z bazy danych,
DBMS_DIMENSION – używany głównie do
obsługi hurtowni danych i umożliwia
wyświetlanie informacji o wymiarach,
DBMS_CRYPTO – obsługuje zaawansowane
szyfrowanie,
DBMS_DATAPUMP – ułatwia przenoszenie
danych i metadanych między bazami danych
niezależnie od systemu czy sprzętu,
10
2011-01-13
Przegląd pakietów wbudowanych






DBMS_HS – umożliwia komunikacje z bazami
danych innymi niż Oracle,
DBMS_JAVA – pozwala na dostęp do
mechanizmów języka Java w języku PL/SQL,
DBMS_LOB – obsługa typów LOB w PL/SQL,
DBMS_OUTPUT – pozwala na debugowanie i
buforowanie danych tekstowych,
DBMS_RANDOM – generator liczb losowych,
DBMS_REPAIR – przeznaczony dla
administratorów, służy do wykrywania
uszkodzonych tabel i bloków indeksów, pomaga w
ich naprawie,
Przegląd pakietów wbudowanych




DBMS_WARNING – umożliwia stosowanie w
kodzie PL/SQL zaawansowanych funkcji do
obsługi ostrzeżeń,
UTL_FILE – zapisuje dane do plików systemu
operacyjnego i odczytuje je,
UTL_HTTP – służy do dostępu do danych
przez internet,
UTL_MAIL – służy do zarządzania pocztą
elektroniczną,
Przegląd pakietów wbudowanych



DBMS_SCHEDULER – służy do tworzenia,
konserwacji, planowania i klasyfikowania
potrzebnych zadań,
DBMS_STANDARD i STANDARD –
zawierają podstawowe funkcje wbudowane
przeznaczone dla programistów aplikacji, nie
trzeba używać ich z nazwą pakietu,
DBMS_TRANSACTION – udostępnia
instrukcje do kontroli transakcji,
DBMS_OUTPUT




Pakiet służący do wysyłania komunikatów z
podprogramów składowanych i wyzwalaczy,
Przesyła dane tekstowe z dowolnego bloku
PL/SQL do bufora w bazie danych,
Komunikaty nie są przesyłane aż podprogram
lub wyzwalacz nie zakończy działania,
Wymaga stosowania SET SERVEROUTPUT
ON w celu wyświetlania komunikatów w SQL
Developer i SQL*Plus,
11
2011-01-13
DBMS_OUTPUT - procedury
SET SERVEROUTPUT ON SIZE n – ustawia
rozmiar bufora na n znaków, minimum to 2000,
maksimum nieograniczony, domyślnie 20000,
 DBMS_OUTPUT.ENABLE – umożliwia
odwołania do procedur pakietu, pozwala na
ustalenie rozmiaru bufora w zakresie 2000 1000000 za pomocą wywołania z parametrem
DBMS_OUTPUT.ENABLE (10000); gdy null to
wartość domyślna 20000,
DBMS_OUTPUT - procedury
DBMS_OUTPUT.DISABLE – wyłącza
możliwość odwołań do procedur pakietu, bez
parametrów,
 DBMS_OUTPUT.PUT – wysłanie komunikatu
tekstowego do bufora,
DBMS_OUTPUT.PUT(’witaj’);
 DBMS_OUTPUT.NEW_LINE – wstawia
znacznik końca linii w buforze, bez
parametrów,


DBMS_OUTPUT - procedury
DBMS_OUTPUT - procedury
DBMS_OUTPUT.PUT_LINE – kombinacja PUT i
NEW_LINE, parametr typu VARCHAR2,
NUMBER, DATE,
DBMS_OUTPUT.PUT_LINE(’Witaj’);
DBMS_OUTPUT.PUT_LINE(x);
 DBMS_OUTPUT.GET_LINE – pobiera linię z
bufora do zmiennej w procedurze,
DBMS_OUTPUT.GET_LINE (line OUT
VARCHAR2, status OUT INTEGER);
line – pobrana linia, status – 0 jeśli powodzenie,


DBMS_OUTPUT.GET_LINES – pobiera
tablicę linii z bufora do zmiennej w procedurze,
DBMS_OUTPUT.GET_LINES ( lines OUT
CHARARR, numlines IN OUT INTEGER);
CHARARR – tablica typu VARCHAR2(255),
numlines – liczba pobieranych linii.
12
2011-01-13
UTL_FILE






pakiet umożliwia zapis i odczyt plików
tekstowych z kodu PL/SQL wykonywanego
przez serwer bazy danych,
Wybrane procedury i funkcje:
ISOPEN – określa czy uchwyt należy do
otwartego pliku,
FOPEN – otwiera plik do odczytu lub zapisu,
FCLOSE – zamyka otwarty plik,
GET_LINE – odczytuje tekst z otwartego pliku,
Odczyt i zapis

Tryby otwarcia:
UTL_FILE







Odczyt i zapis

’r’ – do odczytu,
 ’w’ – do zapisu,
 ’a’ – do dołączania,


UTL_FILE.FOPEN ( location IN VARCHAR2,
filename IN VARCHAR2, open_mode IN
VARCHAR2) RETURN UTL_FILE.FILE_TYPE;
f:=UTL_FILE.FOPEN(dir,file,’a’);
FREMOVE – usuń plik, musisz mieć uprawnienia,
FRENAME – zmień nazwę pliku,
PUT_LINE – wstawia linię tekstu do pliku,
FCOPY – kopiuje część pliku do nowego pliku,
FGETATTR – pobiera i wyświetla atrybuty pliku,
NEW_LINE – znacznik nowej linii wstawiony do
otwartego pliku,
FFLUSH – zapisuje wszystkie zbuforowane dane
do pliku,
UTL_FILE.GET_LINE ( file IN FILE_TYPE, buffer
OUT VARCHAR2);
UTL_FILE.GET_LINE(f,buf);

UTL_FILE.FCLOSE ( file IN OUT FILE_TYPE);
UTL_FILE.FCLOSE(f);
13
2011-01-13
Odczyt i zapis

UTL_FILE.PUT_LINE ( file IN FILE_TYPE,
buffer IN VARCHAR2);
UTL_FILE.PUT_LINE(f,buf);
Wyjątki związane z UTL_FILE







INVALID_PATH – nie poprawna lokalizacja pliku,
INVALID_MODE – niepoprawny tryb otwarcia pliku,
INVALID_FILEHANDLE – niepoprawny uchwyt do
pliku,
INVALID_OPERATION – plik nie może być otwarty
lub nie można wykonać na nim żądanej operacji,
READ_ERROR – błąd systemu operacyjnego
podczas odczytu,
WRITE_ERROR - błąd systemu operacyjnego
podczas zapisu,
INTERNAL_ERROR – błąd PL/SQL,
Odczyt i zapis - przykład
PROCEDURE Zapisz (nazwa_pliku VARCHAR2) IS
dir VARCHAR2(200);
file VARCHAR2(200);
v_kom employees.last_name%type;
file_h UTL_FILE.FILE_TYPE;
BEGIN
dir := 'd:\pom';
file := nazwa_pliku;
file_h := UTL_FILE.FOPEN(dir, file, 'w');
SELECT last_name INTO v_kom FROM employees WHERE
employee_id=105;
UTL_FILE.PUT_LINE(file_h, v_kom);
UTL_FILE.PUT_LINE(file_h, sysdate);
UTL_FILE.FCLOSE(file_h);
END Zapisz;
Wyjątki związane z UTL_FILE






FILE_OPEN - plik jest już otwarty,
INVALID_MAXLINESIZE - zła wartość podana
dla FOPEN,
INVALID_FILENAME – nieprawidłowa nazwa
pliku,
ACCESS_DENIED – odmowa dostępu do
lokalizacji pliku,
DELETE_FAILED – nieudana operacja usuwania
pliku,
RENAME_FAILED – nieudana operacja zmiany
nazwy pliku.
14
2011-01-13
Wyjątki - przykład
PROCEDURE Zapisz (nazwa_pliku VARCHAR2) IS
dir VARCHAR2(200); file VARCHAR2(200);
v_kom employees.last_name%type;
file_h UTL_FILE.FILE_TYPE;
BEGIN
dir := 'd:\pom'; file := nazwa_pliku;
file_h := UTL_FILE.FOPEN(dir, file, ‚w');
SELECT last_name INTO v_kom FROM employees WHERE
employee_id=105;
UTL_FILE.PUT_LINE(file_h, v_kom);
UTL_FILE.FCLOSE(file_h);
EXCEPTION
WHEN UTL_FILE.WRITE_ERROR THEN
RAISE_APPLICATION_ERROR(-20002,’nie można zapisać do pliku’);
END Zapisz;
WYKORZYSTANA LITERATURA



J. Price, Oracle Database 11g i SQL.
Programowanie. Helion, 2009.
S. Urman, R. Hardman, M. McLaughlin, Oracle
Database 10g. Programowanie w języku
PL/SQL. Helion, 2008.
www.oracle.com
15

Podobne dokumenty