Professional Documents
Culture Documents
Spis treści
1 Wprowadzenie 1
2 PL/SQL - podstawy 1
2.1 Zmienne i stałe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.2 Operatory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.3 SQL w PL/SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.4 Instrukcje sterujące . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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ęzy-
ku Ada). Umożliwia wykorzystywanie konstrukcji takich jak pętle, instrukcje warunkowe,
zmienne oraz tworzenie procedur, funkcji, wyzwalaczy użytkownika wspomagających kon-
kretną 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 kompilowany,
• ma strukturę blokową,
• operator przypisania to := ,
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.
[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, RO-
WID, 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;
%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 rekordo-
wego zgodnego z typami kolumn podanej tabeli.
DECLARE
zmienna_rekordowa tabela%ROWTYPE;
Przykład:
DECLARE
vr_pracownik pracownicy%ROWTYPE;
Zmienne związane
• Są związane z sesją
Zmienne związane
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;
• Niejawna konwersja
– Znaki i liczby
– Znaki i daty
• Jawna konwersja
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:
• arytmetyczne (+,-,/,*)
• konkatenacji (||)
• negacji (-)
• nawiasy okrągłe
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:
Instrukcja SELECT
Instrukcja SELECT musi zwrócić tylko jeden wiersz !!!
SELECT lista_wyrazen
INTO {lista_zmiennych | zmienna_rekorodwa}
FROM lista_relacji...;
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:
7
INSERT INTO tabela VALUES zmienna_rekordowa;
UPDATE tabela SET ROW = zmienna_rekordowa
WHERE warunek;
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;
• 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ą
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
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
v_nazwisko := &nazwisko;
dbms_output.put_line(tekst);
dbms_output.new_line;
dbms_output.put_line(
'Hello'||CHR(10)||' World');
CLEAR SCREEN;
CL SCR; -- skrócona forma
10
3 Podsumowanie
Podsumowanie
PL/SQL pozwala na:
4 Źródła
Źródła
• http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/toc.htm
• 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