Plan wykładu BAZY DANYCH II WYKŁAD 2 Bloki, struktura, sekcje Bloki anonimowe Tworzenie i uruchamianie Identyfikatory Literały Typy danych dr inż. Agnieszka Bołtuć Bloki Struktura bloku W programach pisanych w PL/SQL podstawową jednostką jest blok, Program składa się przynajmniej z jednego bloku, Bloki mogą być zagnieżdżone, Bloki mogą być wykonywane tylko raz, bez zapisywania, Bloki mogą być też zapisywane w bazie w celu ich późniejszego wykorzystania, Bloki obsługują wszystkie instrukcje DML, a także DDL (za pomocą specjalnego pakietu). DECLARE (opcjonalne) deklaracje zmiennych, kursory, wyjątki BEGIN (wymagany) wyrażenia SQL i PL/SQL EXCEPTION (opcjonalny) obsługa wyjątków END; (wymagany) 1
Minimalna struktura bloku Sekcja deklaracji BEGIN NULL; END; BEGIN END; Każdy blok musi zawierać przynajmniej jedno wykonywalne polecenie, inaczej zostanie wygenerowany błąd. Jest to sekcja opcjonalna, Umieszczamy w niej zmienne i ich typy, stałe, kursory, wyjątki definiowane przez użytkownika, wszystko to do czego odwołujemy się w kolejnej sekcji bloku, Oprócz deklaracji zmiennych można dokonać w tym miejscu także ich inicjalizacji. DECLARE v_zmienna TIMESTAMP; Sekcja wykonawcza Jest niezbędna, Rozpoczyna się od słowa kluczowego BEGIN, Musi posiadać co najmniej jedną instrukcję, Może zawierać dowolną liczbę bloków PL/SQL, Może zawierać polecenia SQL aby pobierać dane z bazy lub/i PL/SQL aby przetwarzać je w bloku, Sekcja wyjątków Opcjonalna, Jest zagnieżdżona w sekcji wykonywalnej, Rozpoczyna się od słowa kluczowego EXCEPTION, Pozwala na przechwytywanie błędów i nienormalnych zachowań wygenerowanych w sekcji wykonawczej, Błędy przechwytywane są za pomocą funkcji dostępnych pakietach lub instrukcji dyrektyw. 2
Podstawowe typy bloków Bloki anonimowe Bloki anonimowe, Bloki nazwane: procedury, funkcje. Nie posiadają nazwy i nie są przechowywane w bazie danych, Można w nich wywoływać inne programy, ale ich nigdzie nie można wywołać, Są kompilowane za każdym razem gdy program jest uruchamiany, Ich struktura jest taka jak na poprzednim slajdzie. Przykład Tworzenie i uruchamianie SET SERVEROUTPUT ON DECLARE v_imie VARCHAR2(20); włącza wyjście serwera BEGIN SELECT first_name INTO v_imie FROM employees WHERE employee_id=200; pobiera imię pracownika nr 200 do zmiennej v_imie DBMS_OUTPUT.PUT_LINE(v_imie); END; procedura z wbudowanego pakietu Oracle Okno główne programu Oracle Express Edition SQL Command 3
Tworzenie i uruchamianie Tworzenie i uruchamianie Okno główne programu Oracle SQL Developer Run Script Okno główne programu SQL*Plus Zasady języka Identyfikatory Znaki specjalne Słowa zarezerwowane Ograniczniki Literały Komentarze Identyfikatory Służą do nazywania zmiennych, kursorów, funkcji, procedur, etc., Zasady tworzenia: <30 znaków Rozpoczynają się literą Mogą zawierać znaki $,#,_ i cyfry (oprócz pierwszej pozycji), Nie mogą zawierać znaków przestankowych, odstępów i myślników, Nie mogą zawierać słów zarezerwowanych, Wyjątek to identyfikatory w cudzysłowach, gdzie można stosować prawie wszystko. 4
Znaki i słowa zarezerwowane Ograniczniki Są to identyfikatory interpretowane jako polecenia które mają inny specjalny cel, Jeśli użyjemy je w aplikacji jako np. nazwę zmiennej to wystąpią błędy, Mogą zmieniać się biorąc pod uwagę wersje, Najlepszą praktyką jest przyjmowanie specjalnej konwencji nazw, tzn. Zmienna v_nazwa Stała c_nazwa Kursor cur_nazwa Itd. +,-,*,/ - operatory matematyczne, >,<,<>,=,!= - operatory relacji, --, /*, */ - komentarze, <<, >> - etykiety, % - atrybuty (TYPE, etc.), ogranicznik łańcuchów znaków, ogranicznik identyfikatorów, := - przypisanie, inicjalizacja zamiennej, - łączenie łańcuchów znaków, Literały Literały Wartości nie reprezentowane przez identyfikator, Znaki i łańcuchy znaków zapisujemy w pojedynczych apostrofach, DBMS_OUTPUT.PUT_LINE( Równanie Laplace a ) błąd, DBMS_OUTPUT.PUT_LINE( Równanie Laplace a ) stosujemy dwa apostrofy, nie cudzysłów, DBMS_OUTPUT.PUT_LINE(q!Równanie Laplace a! ) DBMS_OUTPUT.PUT_LINE(q [Równanie Laplace a ] ) - od wersji 10g DBMS_OUTPUT.PUT_LINE(q <Równanie Laplace a> ) Wartości logiczne w PL/SQL to TRUE, FALSE i NULL, Związane z datą i czasem: np. 2004-06-05, etc. 5
Deklaracja i używanie zmiennych Deklaracja i używanie zmiennych identyfikator [CONSTANT] typ_danych [NOT NULL] [:= DEFAULT wartość]; DECLARE v_data_urodzenia DATE; v_numer_pozycji NUMBER(2) NOT NULL :=10; v_nazwa VARCHAR2(10) DEFAULT kot ; c_numer CONSTANT NUMBER(3) :=100; zmienna musi być zainicjalizowana DECLARE v_nazwa NUMBER(2); BEGIN v_nazwa:=120; DBMS_OUTPUT.PUT_LINE( Ta liczba to v_nazwa); END; stała musi być zainicjalizowana Dobre nawyki i zasady - zmienne Typy danych języka PL/SQL Nazwy identyfikatorów powinny być samoopisowe, Używaj konwencji v_ do zmiennej, c_ do stałej, etc., Inicjuj wartość, gdy deklarujesz zmienną NOT NULL lub stałą, Nie używaj nazw kolumn do nazywania zmiennych, Typy skalarne, Typy referencyjne, Typy złożone, Typy LOB. 6
Typy skalarne Znaki i łańcuchy znaków Znaki i łańcuchy znaków, Liczby, Typy logiczne, Data i czas. CHAR [(max długość)] - typ danych o stałej liczbie znaków, pojemność określamy w bajtach, maksymalnie 32,767 bajtów VARCHAR2 (max długość) typ danych w Oracle 10g, i inne nie stosowane lub nie zalecane, np. LONG, LONG ROW, Typy liczbowe Typy liczbowe oraz logiczne NUMBER [(precyzja, skala)] precyzja wartości od 1 do 38, skala -84 do 127, identyczny z typem NUMBER bazy danych, BINARY_INTEGER wartości z przedziału od -2147483647 do + 2147483647, przechowywane w postaci binarnej, PLS_INTEGER zalecany przez Oracle typ, stosowany w obrębie bloku, bez zapisu do bazy, BINARY_DOUBLE, BINARY_FLOAT nowość od wersji Oracle 10g, typ zmiennoprzecinkowy o podwójnej (pojedynczej) precyzji zgodny z IEEE-754, BOOLEAN przyjmuje wartości TRUE, FALSE, NULL. 7
Data i czas Data i czas DATE podstawowy typ dotyczący daty i czasu, możne przechowywać rok, miesiąc, dzień, godzinę, minutę, sekundę, TIMESTAMP: TIMESTAMP [(precyzja)] rozszerzenie typu DATE o ułamki sekund, w tym celu określa się precyzję 0-9, domyślnie 6, TIMESTAMP WITH TIME ZONE jak wyżej, tylko uwzględnia czas lokalny względem strefy UTC, TIMESTAMP WITH LOCAL ZONE jak wyżej, tylko odpowiada lokalizacji klienta korzystającego z sewera bazodanowego. INTERVAL: INTERVAL YEAR TO MONTH zwraca różnicę pomiędzy datami, uwzględnia wartości od lat do miesięcy, INTERVAL DAY TO SECOND - zwraca różnicę pomiędzy datami, uwzględnia wartości od dni do sekund, Typy danych - przykłady Typy złożone v_time DATE :=SYSDATE+5; v_znak VARCHAR2(5) NOT NULL := znak ; v_liczba PLS_INTEGER; v_logika BOOLEAN :=TRUE; c_stala CONSTANT NUMBER(5,2) :=0; Rekordy, Kolekcje: tabele zagnieżdżone, indeksowane, tablice VARRAY. 8
Typ zakotwiczony Typ zakotwiczony %TYPE jeśli deklarowana zmienna jest bezpośrednim odwzorowaniem kolumny z bazy danych można zakotwiczyć typ zmiennej do typu bazy danych kolumny, identyfikator tabela.kolumna%type; v_nazwisko employees.last_name%type; v_id employees.employee_id%type :=0; Zalety: Przydatne przy zmienianiu typu danych w tabeli, Przydatne przy zmianie precyzji, Przy tworzeniu dużych bloków daje oszczędność czasu i odporność na błędy, Typ zakotwiczony Typ zakotwiczony %ROWTYPE zakotwicza zmienną do wszystkich kolumn tabeli, identyfikator tabela%rowtype; employees_record employees%rowtype; jobs_record jobs%rowtype; Zalety: Nie musi być znana liczba i typy kolumn przy deklaracji zmiennej rekordowej, Szczególnie przydatne przy pobieraniu wiersza za pomocą klauzuli SELECT oraz INSERT i UPDATE. 9
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 10