PL/SQL Lidia Małkiewicz i Cezary Skubała
Jest językiem trzeciej generacji (3GL), który udostępnia konstrukty programistyczne, włączając w to deklaracje zmiennych, pętlę, obsługę błędów itd. Obecnie PL/SQL można traktować jako język obiektowy. PL/SQL jest proceduralnym (a czasem obiektowym) rozszerzeniem języka SQL, wywodzącym się z języka Ada. stworzone i udostępnione przez Oracle i przeznaczone do obsługi narzędzi tej firmy PL/SQL co to jest?
PL/SQL 1.0 wprowadzono w 1991 roku, wersja była ograniczona i brakowało w niej wielu funkcji, wypuszczona z wersją serwera bazodanowego 6.0. Kolejna wersja 2.3 udostępniała obsługę procedur i funkcji składowanych. Wersja 8.0 wprowadzenie modelu obiektowo-relacyjnego. Wersje 8.1, 9.0, 9.2, 10.0 to kolejne udoskonalenia języka. Najnowsza wersja to 11.0 Historia, jak już mniej więcej wiemy co to jest
SQL Zapewnia kompletny dostęp do danych. Oznacza to, że można pobrać dowolne dane po pewnym czasie (z pewnym opóźnieniem) i w wielu przypadkach w niedoskonały sposób. Nie ma gwarancji, co do wydajności oraz przede wszystkim aktualności lub dostępności danych. Język deklaratywny, strukturalny do tworzenia zapytań do relacyjnej bazy danych. PL/SQL Pozwala na tworzenie procedur, funkcji, pakietów, wyzwalaczy i bloków anonimowych. Umożliwia przechodzenie w pętli po rekordach i manipulowanie każdym z nich po kolei. W programie PL/SQL można umieszczać polecenia DML, natomiast nie jest możliwe bezpośrednie wykonanie w programie poleceń z grupy DDL (poleceń tworzenia nowych obiektów, np. relacji) i DCL (poleceń sterowania przebiegiem sesji).język nie jest przeznaczony do interakcji z użytkownikiem, stąd brak w nim wielu mechanizmów, obecnych w innych językach. Jednak PL/SQL pozwala na definiowanie programów trwale zapisywanych w bazie danych, tzw. programów składowanych, w postaci funkcji, procedur oraz bibliotek, nazywanych pakietami. PL/SQL a SQL
Przebieg działania
Co to jest blok Podstawowa jednostka w PL/SQL Program składa się przynajmniej z jednego bloku Bloki mogą być zagnieżdżone Bloki mogą być wykonywane tylko raz, bez zapisywania (bloki anonimowe) Bloki można zapisywać w bazie w celu ich późniejszego wykorzystania (bloki nazwane) Bloki obsługują wszystkie instrukcje DML
Struktura bloku DECLARE (nie jest wymagane) deklaracje zmiennych, wyjątki BEGIN wyrażenia SQL i PL/SQL EXCEPTION (nie jest wymagane) obsługa wyjątków END;
Rodzaje bloków PL/SQL - anonimowe - nazwane: - procedury - funkcje - wyzwalacze
Bloki anonimowe Bloki anonimowe nie posiadają nazwy i nie są przechowywane w bazie danych. Można je stworzyć w celu jednorazowego wykonania kodu, są kompilowane przy każdym uruchomieniu programu. Można w nich wywoływać inne programy, ale ich nigdzie nie można wywołać.
Procedury Są to, podobnie jak funkcje i wyzwalacze, bloki posiadające nazwę. Procedury są przechowywane w bazie danych.
Przykładowa procedura
Funkcje Funkcje, w przeciwieństwie do procedur, muszą zwracać wynik.
Przykładowa funkcja
Wywołanie funkcji Do wywołania funkcji można skorzystać z pseudo tabeli DUAL, która ma jeden wiersz i jedną kolumnę oraz nie posiada żadnych danych.
Wyzwalacze Wyzwalacze (trigger) są blokami wykonywanymi w reakcji na określone zdarzenie w bazie danych.
Przykładowy wyzwalacz
Podstawowe składowe języka Identyfikatory Ograniczniki Literały Słowa zarezerwowane
Identyfikatory Służą do nazywania zmiennych, kursorów, funkcji, procedur itd. Zasady tworzenia identyfikatorów: <30 znaków Rozpoczynają się literą Mogą zawierać znaki $,#,_ i cyfry, Nie mogą zawierać znaków przystankowych, odstępów i myślników, Nie mogą zawierać słów zarezerwowanych, Wyjątek to identyfikatory w cudzysłowach - można w nich stosować prawie wszystko.
Ograniczniki +,-,*,/ - operatory matematyczne >,<,<>,=,!= - operatory porównania --, /*, */ - komentarze <<, >> - etykiety % - atrybuty (TYPE) ogranicznik łańcuchów znaków ogranicznik identyfikatorów := - przypisanie, inicjalizacja zmiennej - łączenie łańcuchów znaków
Literały Wartości, które nie są reprezentowane przez identyfikatory, ani nie są wyliczane na podstawie innych wartości: Znakowe: np. abc Liczbowe: 1, 2, 456 Logiczne: TRUE, FALSE Związane z datą, godziną 23-12-2013
Typy danych Typy liczbowe BINARY_INTEGER DEC DECIMAL DOUBLE PRECISION FLOAT INT INTEGER NATURAL NATURALN (not null) NUMBER NUMERIC PLS_INTEGER POSITIVE POSITIVEN (not null) REAL SIGNTYPE SMALLINT Typy znakowe CHAR CHARACTER LONG NCHAR NVARCHAR2 RAW STRING VARCHAR VARCHAR2 Typ logiczny BOOLEAN, literały: TRUE (prawda), FALSE (fałsz) Typy czasowe DATE TIMESTAMP INTERVAL Typy wskaźnikowe REF CURSOR REF object_type PL/SQL obsługuje wszystkie typy SQL oraz wprowadza własne, m. in. boolean i record.
Number(P,S) - przechowuje liczby rzeczywiste oraz całkowite. P - liczba cyfr w liczbie, S - ilość miejsc po przecinku. Char(L) - przechowuje stałą ilość znaków zadeklarowaną jako parametr L. W SQL maksymalnie można przechowywać 256 znaków natomiast w PL/SQL - 32768 znaków. Varchar2(L) - zajmuje tyle miejsca, ile zostanie przypisanych znaków. Parametr L określa maksymalną ilość znaków. Maksymalna długość wynosi 32768 w PL/SQL oraz 4000 w SQL. Raw(L) - typ zachowujący się jak Char (L), jednak służy do przechowywania danych binarnych. Date - przechowuje informacje o wieku, roku, miesiącu, dniu, godzinie, minucie oraz sekundzie. Boolean - typ, który może przyjmować tylko 3 wartości: TRUE, FALSE, NULL. Nie miał swojego odpowiednika w SQL. Typy danych
Struktury sterujące Instrukcje sterujące służą w kodzie źródłowym do kierowania kolejnością wykonywania kolejnych czynności, z których złożony jest dany algorytm.
Sekwencja Sekwencja poleceń wykonywanych w określonym porządku. Każde polecenie kończy się średnikiem. Przykład: DECLARE v_i NUMBER(3) := 0; v_nazwa VARCHAR2(10); BEGIN v_i := v_i + 1; v_nazwa := 'ABC'; v_nazwa := v_nazwa 'DEF'; END;
Selekcja instrukcja IF... THEN If warunek then sekwencja; elsif warunek then sekwencja; else sekwencja end if;
Przykładowa instrukcja IF THEN
Instrukcja CASE case when warunek1 then sekwencja1; when warunek2 then sekwencja2; end case;
Przykładowa instrukcja CASE
Pętla LOOP Pętla LOOP wykonuje się dopóki warunek w klauzuli exit when jest prawdziwy. W przypadku braku warunku wyjścia pętla będzie wykonywać się w nieskończoność lub do czasu natrafienia na błąd.
Pętla WHILE Do czasu aż zmienna jest mniejsza od 20 wykonuje określone czynności.
Pętla FOR Dopóki zmienna o nazwie iterator ma wartość zawartą w zbiorze od 1 do 6 wykonuje dane czynności. Iterator zwiększa się o 1 przy każdym cyklu. Można sprawić by pętla wykonała się od końca dodając klauzulę REVERSE.
Polecenie SELECT INTO SELECT lista_zmiennych INTO nazwa_zmiennej nazwa_rekordu FROM tabela WHERE warunki; SELECT INTO przekazuje wartości uzyskane z bazy (lista_zmiennych) do zmiennych występujących w klauzuli INTO
Zmienne rekordowe Definicja rozpoczyna się od słowa TYPE, następna jest nazwa nowego typu, musimy też pamiętać o dodaniu klauzuli is record. Pomiędzy nawiasami podajemy kolejne zmienne wraz z ich typami, będące składowymi rekordu. Pomiędzy nimi stawiamy przecinki, po ostatniej zmiennej nie stawiamy go. Posiadając zdefiniowaną strukturę rekordu możemy stworzyć zmienną nowo stworzonego typu.
Przykładowy rekord
Obsługa wyjątków Ważnym elementem każdej profesjonalnej aplikacji jest obsługa błędów (wyjątków). W PL/SQL standardowe błędy (wyjątki) mają przyporządkowane nazwy. Oto najczęściej używane nazwy błędów (wyjątków). dup_val_on_index - powtórzenie tej samej wartości w indeksie jednoznacznym, no_data_found - instrukcja SELECT nie zwróciła wartości dla zmiennych w klauzuli INTO, too_many_rows - instrukcja SELECT zwróciła więcej niż jeden wiersz wartości dla zmiennych w klauzuli INTO, zero_divide - dzielenie przez zero, timeout_on_resource - zbyt długie oczekiwanie na zasoby, invalid_cursor - niepoprawna operacja na kursorze, login_denied - niepoprawna nazwa użytkownika/hasło, invalid_number - niepoprawna konwersja na liczbę, storage_error - brak pamięci, value_error - błąd związany z działaniem na wartościach,
DML Data Manipulation Language Zbiór instrukcji języka zapytań (np. SQL) używanych do przetwarzania danych z bazy danych. Są to instrukcje takie jak: INSERT, UPDATE i DELETE.
DML w PL/SQL Zapytanie musi zwrócić jeden rekord. W zapytaniu dodatkowa klauzula INTO, w niej - lista zmiennych prostych, liczba zmiennych musi odpowiadać liczbie wyrażeń w klauzuli select, typy muszą być zgodne - zmienna rekordowa o strukturze zgodnej ze struktura rekordu, odczytywanego przez zapytanie
DML przykład z relacji ZESPOLY rekord, opisuje zespół o nazwie ADMINISTRACJA. Wartość rekordu zostaje zachowana w zmiennej rekordowej v_zespol. Następnie na podstawie wartości pola id_zesp zmiennej v_rekord drugie zapytanie odczytuje sumę płac i liczbę pracowników w zespole ADMINISTRACJA. Wyliczone wartości trafiają do zmiennych prostych v_suma_plac i v_ilu_pracownikow, a następnie zostają wypisane na konsoli
Łatwiejsze wykonanie poniektórych zadań poprzez umożliwienie utworzenia programu, który wykonuje określone operacje na bazie danych Anonimowy blok jest podstawowa jednostka języka pl/sql Blok umożliwia wprowadzenie instrukcji sekwencji, selekcji oraz iteracji W bloku można umieszczać instrukcje DML, ale zabronione jest umieszczanie DDL i DCL Dostepnosc dodatkowej puli mechanizmow, np. instrukcji sterujących Pełna kompatybilność platform dla których oferowany jest SZBD Oracle wynikająca z wykonania na serwerze Zwiększenie wydajności Podsumowanie PL/SQL