You are on page 1of 11

Plan wykładu

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 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, 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;

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 rekordo-
wego 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 z klauzulą 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 zmien-


nych 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

You might also like