Spis treści 1 Wprowadzenie 2 PL/SQL

Transkrypt

Spis treści 1 Wprowadzenie 2 PL/SQL
Plan wykładu
Spis treści
1 Wprowadzenie
1
2 PL/SQL - podstawy
2.1 Zmienne i stałe . .
2.2 Operatory . . . . .
2.3 SQL w PL/SQL . .
2.4 Instrukcje sterujące
1
3
6
6
8
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3 Podsumowanie
11
4 Źródła
11
1
Wprowadzenie
PL/SQL
PL/SQL
(ang. Procedural Language/Structured Query Language) - język programowania będący
proceduralnym rozszerzeniem SQL wprowadzonym przez firmę Oracle (oparty na języku Ada). Umożliwia wykorzystywanie konstrukcji takich jak pętle, instrukcje warunkowe,
zmienne oraz tworzenie procedur, funkcji, wyzwalaczy użytkownika wspomagających konkretną realizację bazy danych.
Rozwiązanie specyficzne dla SZBD Oracle, jednakże każdy dystrybutor udostępnia
swoje rozwiązania (np. PL/pgSQL w PostgreSQL), które są zbliżone do PL/SQL’a.
Cechy PL/SQL
• język proceduralny nastawiony na przetwarzanie danych,
• język kompilowany,
• język obsługujący zmienne, stałe, struktury sterujące, wyjątki,
• ma strukturę blokową,
• każda instrukcja wewnątrz bloku PL/SQL jest zakończona średnikiem ”;”,
• operator przypisania to := ,
• może zawierać instrukcje DML i TCL,
• nie może zawierać instrukcji DDL i DCL (nadawanie uprawnień),
• pozwala na tworzenie kodu wielokrotnego użytku.
2
PL/SQL - podstawy
Bloki PL/SQL
Podstawową jednostką, z której składa się program w PL/SQL jest blok, wyróżniamy:
• bloki anonimowe,
1
• bloki nazwane,
• bloki podrzędne.
Każdy blok składa się z maksymalnie czterech części:
• deklaracyjnej (opcjonalnie),
• wykonywalnej zaczynającej się słowem begin (obowiązkowo),
• obsługi wyjatków (opcjonalnie),
• end; (obowiązkowo).
Struktura bloku PL/SQL
[DECLARE
zmienne; kursory;
wyjatki_uzytkownika;]
BEGIN
bloki_podrzedne;
instrukcje_SQL;
instrukcje_PL/SQL;
[EXCEPTION
obsluga_wyjatkow;]
END;
Komentarze
W PL/SQL stosuje się dwa rodzaje komentarzy:
• jednowierszowe - rozpoczynające się od znaków -• wielowierszowe -
rozpoczynające się od znaków /*, a kończące */.
Typy danych
PL/SQL obsługuje wszystkie typy danych SQL, oraz posiada wiele swoich, dodatkowych typów, które
możemy podzielić następująco:
• typy proste:
– numeryczne (BINARY INTEGER, PLS INTEGER, BINARY FLOAT, BINARY DOUBLE,
NUMBER ...),
– znakowe (CHAR, VARCHAR2, RAW, NCHAR, NVARCHAR2, LONG, LONG RAW, ROWID, UROWID)
– BOOLEAN
– daty i czasu (DATE, TIMESTAMP, TIMESTAMP WITH TIME ZONE, TIMESTAMP
WITH LOCAL TIME ZONE)
– przedziały czasowe (INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND)
• typy złożone (RECORD, kolekcje: tablice asocjacyjne, NASTED TABLE, VARRAY),
• typy referencyjne (REF CURSOR, REF typ obiektowy),
• duże obiekty (BFILE, BLOB, CLOB, NCLOB),
• typy definiowane przez użytkownika.
2
2.1
Zmienne i stałe
Użycie zmiennych
• Tymczasowe przechowywanie danych
• Modyfikacja danych przechowywanych w bazie
• Ponowne użycie
Nazwa zmiennej
• Musi zaczynać się od litery
• Może zawierać litery i cyfry
• Może zawierać znaki specjalne
• Nie może zawierać więcej niż 30 znaków
• Nie może zawierać słów zarezerwowanych
Wykorzystanie zmiennych
Zmienne są:
• Deklarowane i opcjonalnie inicjalizowane w sekcji deklaracji
• Używane w sekcji wykonywalnej
• Przekazywane jako parametry do podprogramów w PL/SQL
• Używane do przechowywania wartości zwracanej przez podprogram w PL/SQL
Deklaracja i inicjalizacja
Deklaracja zmiennych:
DECLARE
nazwa_zmiennej [CONSTANT] typ[(rozmiar)]
[NOT NULL] [{:= | DEFAULT} wartosc];
Np.:
DECLARE
v_wiek NUMBER(3);
v_plec VARCHAR2(9);
v_licznik NUMBER(4) NOT NULL := 0;
v_suma NUMBER(10) DEFAULT 0;
c_pi NUMBER := 3.14159;
Deklaracja i inicjalizacja
DECLARE
v_imie VARCHAR2(20) := 'Anna';
v_nazwisko VARCHAR2(30);
BEGIN
v_nazwisko := 'Nowacka';
DBMS_OUTPUT.PUT_LINE(
'Nazywam się ' || imie || ' ' || nazwisko);
END;
/
3
Stałe
Deklaracja stałych:
DECLARE
nazwa_stalej CONSTANT typ[(rozmiar)]
{:= | DEFAULT} wartosc;
Np.:
DECLARE
c_procent CONSTANT NUMBER(2) := 10;
Specjalne znaki w zmiennych znakowych
• Dodatkowy znak apostrofu:
v_string VARCHAR2(20) := 'I''m learning';
• Określanie ogranicznika z notacją q’:
v_string := q'!I'm listening!';
v_string := q'[I'm bored]';
• Określenie ogranicznika nq’ dla typów NCHAR i NVARCHAR:
v_nstr NVARCHAR2(20) := nq'<I'm sleeping>';
v_nstr := nq'{I'm dreaming}';
%TYPE
Atrybut %TYPE jest wykorzystywany aby zadeklarować zmienną takiego samego typu
jak kolumna w tabeli czy inna zmienna.
identyfikator tabela.nazwa_kolumny%TYPE;
Przykłady
DECLARE
v_imie pracownicy.imie%TYPE;
v_nazwisko pracownicy.nazwisko%TYPE;
Zmienne rekordowe
Deklaracja zmiennych rekordowych:
DECLARE
TYPE nazwa_typu_rekordowego IS RECORD (
pole1 typ [NOT NULL] [inicjalizacja]
[, pole2 typ [NOT NULL] [inicjalizacja] ...]
);
nazwa_zmiennej typ_rekordowy;
Np.:
DECLARE
TYPE r_adres IS RECORD (
v_ulica VARCHAR2(30),
v_nr_domu VARCHAR2(4),
v_nr_mieszkania VARCHAR2(4)
);
vr_adres r_adres;
4
%ROWTYPE
Atrybut %ROWTYPE jest wykorzystywany aby zadeklarować zmienną typu rekordowego zgodnego z typami kolumn podanej tabeli.
DECLARE
zmienna_rekordowa tabela%ROWTYPE;
Przykład:
DECLARE
vr_pracownik pracownicy%ROWTYPE;
Zmienne związane
• Są tworzone w środowisku PL/SQL
• Są związane z sesją
• Tworzone z użyciem słowa kluczowego VARIABLE
• Używane w SQL i PL/SQL
• Dstępne nawet po zakończeniu wykonywania bloku PL/SQL
• Dostęp poprzez poprzedzenie ich dwukropkiem
Zmienne związane
VARIABLE b_wyplata NUMBER;
VARIABLE b_id NUMBER;
BEGIN
:b_wyplata := 2500;
:b_id := 130;
END;
/
PRINT b_wyplata
-- to samo zapytanie,
-- plan wykonania opracowywany tylko raz
SELECT * FROM PRACOWNICY WHERE PRACOWNIK_ID=:b_id;
Konwersja typów danych
• Niejawna konwersja
– Znaki i liczby
– Znaki i daty
• Jawna konwersja
– z użyciem funkcji wbudowanych,np. To_char, To_number, To_date, To_timestamp
– z użyciem funkcji zdefiniowanych przez użytkownika
5
Zasięg i widoczność zmiennej
• Zasięg zmiennej ograniczony jest do tej części programu, w której jest ona zadeklarowana
i widoczna
• Widoczność zmiennej jest tym fragmentem programu, w którym mamy dostęp do zmiennej
bez zewnętrznego kwalifikatora:
BEGIN <<zewnetrzny>>
DECLARE
v_imie_ojca VARCHAR2(20):='Piotr';
v_data_ur DATE:='1972-04-20';
BEGIN
DECLARE
v_imie_dziecka VARCHAR2(20):='Katarzyna';
v_data_ur DATE:='2002-12-12';
BEGIN
DBMS_OUTPUT.PUT_LINE('Imię ojca: '||v_imie_ojca);
DBMS_OUTPUT.PUT_LINE('Data urodzenia: '||zewnetrzny.v_data_ur);
DBMS_OUTPUT.PUT_LINE('Imię dziecka: '||v_imie_dziecka);
DBMS_OUTPUT.PUT_LINE('Data urodzenia: '||v_data_ur);
END;
END;
END zewnetrzny;
2.2
Operatory
Operatory w PL/SQL
Takie same operatory jak w SQL:
• logiczne (AND, OR, NOT)
• arytmetyczne (+,-,/,*)
• konkatenacji (||)
• porównania (=,<>,!=,<,<=,>,>=, IS NULL, IS NOT NULL, LIKE, BETWEEN, IN)
• negacji (-)
• nawiasy okrągłe
Dodatkowy operator dla potęgowania (**)
2.3
SQL w PL/SQL
SQL w PL/SQL
Jak dołączać instrukcje SQL w kodzie PL/SQL?
Wbudowane funkcje SQL
W kodzie PL/SQL
• można używać wbudowanych funkcji SQL zwracających pojedynczy wiersz (Upper,
Length, Substr, Round, Last_day, To_char itd.)
• nie można używać funkcji DECODE i funkcji agregujących
6
Sekwencje
Można używać sekwencji:
DECLARE
v_id NUMBER;
BEGIN
v_id := nowa_sek.NEXTVAL;
END;
/
SQL w PL/SQL
W bloku PL/SQL można używać niektórych instrukcji SQL:
• zapytania: SELECT with INTO,
• DML: INSERT, UPDATE, DELETE, MERGE,
• TCL: COMMIT, ROLLBACK, SAVEPOINT, SET TRANSACTION, LOCK.
Instrukcja SELECT
Instrukcja SELECT musi zwrócić tylko jeden wiersz !!!
Klauzula INTO jest wymagana !!!
Nazwy kolumn tabel bazodanowych mają pierszeństwo przed nazwami zmiennych lokalnych !!!
SELECT lista_wyrazen
INTO {lista_zmiennych | zmienna_rekorodwa}
FROM lista_relacji...;
Przykład instrukcji SELECT
DECLARE
v_imie pracownicy.imie%TYPE;
BEGIN
SELECT imie INTO v_imie
FROM pracownicy
WHERE id_pracownika = 200;
DBMS_OUTPUT.PUT_LINE('Imie ' || v_imie);
END;
/
SQL w PL/SQL
Składnia instrukcji INSERT, UPDATE i DELETE jest taka sama jak w SQL ale mamy
dodatkowo klauzulę RETURNING wyrazenie INTO zmienna:
INSERT INTO dzialy (dzial_id, dzial_nazwa)
VALUES (90, 'Rozrywka')
RETURNING dzial_id INTO v_id;
Istnieje możliwość wykorzystania zmiennych rekordowych:
7
INSERT INTO tabela VALUES zmienna_rekordowa;
UPDATE tabela SET ROW = zmienna_rekordowa
WHERE warunek;
2.4
Instrukcje sterujące
IF
IF warunek THEN
instrukcja;
END IF;
IF warunek THEN
instrukcja1;
ELSE
instrukcja2;
END IF;
IF warunek1 THEN
instrukcja1;
ELSIF warunek2 THEN
instrukcja2;
...
ELSE
instrukcja_n;
END IF;
CASE
CASE wyrazenie
WHEN wyrazenie1 THEN instrukcja1;
WHEN wyrazenie2 THEN instrukcja2;
...
[ELSE instrukcja_n];
END CASE;
CASE
WHEN warunek1 THEN instrukcja1;
WHEN warunek2 THEN instrukcja2;
...
[ELSE instrukcja_n];
END CASE;
8
Pętle
LOOP
instrukcje;
[IF warunek THEN EXIT; END IF;]
[EXIT WHEN warunek;]
END LOOP;
WHILE warunek LOOP
instrukcje;
END LOOP;
FOR licznik IN [REVERSE] min..max LOOP
instrukcje;
END LOOP;
Sugerowane użycie pętli
• Pętli prostej używamy, kiedy instrukcje wewnątrz muszą się wykonać przynajmniej
raz
• Pętli WHILE używamy kiedy warunek musi być sprawdzany przed iteracją
• Pętli FOR używamy jeśli znana jest liczba iteracji
Przykład z pętlą
DECLARE
v_suma SIMPLE_INTEGER := 1;
BEGIN
FOR i IN 1..10 LOOP
v_suma := v_suma + i;
DBMS_OUTPUT.PUT_LINE('Suma wynosi ' || v_suma);
END LOOP;
END;
/
Instrukcja CONTINUE
• Pozwala rozpocząć nową iterację
• Pozwala na przekazanie sterowania w pętli do następnej iteracji
• Składnia taka sama jak w klauzuli EXIT
9
Przykład pętli z instrukcją CONTINUE
DECLARE
v_suma_cala SIMPLE_INTEGER := 0;
v_czesc SIMPLE_INTEGER := 1;
BEGIN
FOR i IN 1..10 LOOP
v_suma_cala := v_suma_cala + i;
DBMS_OUTPUT.PUT_LINE('Całkowita wartość w iteracji '
|| i || ' is ' || v_suma_cala);
CONTINUE WHEN i > 5;
v_czesc := v_czesc + i;
DBMS_OUTPUT.PUT_LINE('Częściowa wartość w iteracji '
|| i || ' is ' || v_czesc);
END LOOP;
END;
Instrukcja NULL
BEGIN
IF warunek THEN
instrukcje;
ELSE
NULL;
END IF;
END;
Interakcje
• pobieranie danych (zmienne podstawienia):
v_nazwisko := &nazwisko;
• wyprowadzenie danych (włączona zmienna środowiskowa SERVEROUTPUT ON):
dbms_output.put_line(tekst);
dbms_output.new_line;
dbms_output.put_line(
'Hello'||CHR(10)||' World');
• wyczyszczenie ekranu (nie działa w PL/SQL):
CLEAR SCREEN;
CL SCR;
-- skrócona forma
10
3
Podsumowanie
Podsumowanie
PL/SQL pozwala na:
• korzystanie ze zmiennych, stałych,
• korzystanie z instrukcji sterujących,
• przetwarzanie sekwencyjne zorientowane na dane,
• i wiele innych o czym na następnym wykładzie...
4
Źródła
Źródła
• http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/toc.htm
• M. Lentner, Oracle 9i Kompletny podrêcznik u¿ytkownika, PJWSTK - W-wa, 2003
• http://www.ploug.org.pl/showhtml.php?file=szkola/szkola_9/materialy
• http://plsql-tutorial.com/index.htm
• http://www.toadworld.com/platforms/oracle/w/wiki/8243.plsql-obsession.
aspx
11