dbs_PLSQL.pdf

(195 KB) Pobierz
Jêzyk PL/SQL
Język PL/SQL
1. Charakterystyka języka PL/SQL
rozszerzenie SQL o elementy języka proceduralnego
2. Zastosowanie
SQL, aplikacje baz danych np. Oracle Froms, Oracle Reports
Struktura programu w jêzyku PL/SQL
declare /* początek głównego bloku */
/* deklaracje kursorów, zmiennych */
/* wyjątków, w ramach głównego bloku*/
begin
declare /* początek podbloku */
/* deklaracje kursorów*/
* zmienych, wyjątków, w ramach podbloku */
imię char (10);
pensja number (7);
.....
begin
/* instrukcje */
select imię, nazwisko, placa_pod into ... from pracownicy;
.....
exception
/* obsługa wyjątków */
when NO_DATA_FOUND then ;
.....
end ; /* koniec podbloku */
exception
when NO_DATA_FOUND then ...
/* procedury obsługi wyjątków */
end ;
/*koniec głównego bloku */
Zmienne i sta³e
Zmienne Błąd! Nie zdefiniowano zakładki.
proste - wartości typu prostego (np. numeryczne, znakowe)
złożone - wartości są typu złożonego (zmienne te są nazywane rekordami )
1
144812918.001.png
Język PL/SQL
Deklarowanie zmiennych
declare nazwa_zmiennej typ(długość);
declare
licznik number (4); /* zmienna numeryczna o długości 4 cyfr */
znak char (1); /* zmienna znakowa o długości 1 znaku */
flaga boolean ; /* zmienna boolowska */
Tak zadeklarowanym zmiennym można następnie przypisać określoną wartość
używając operatora podstawienia := , np. licznik :=10, znak :='A' .
Deklarowanie stałych
declare nazwa_zmiennej constant typ(długość);
declare liczba_iteracji constant number (3) : = 100;
Typ zmiennej lub stałej można również zadeklarować używając pseudo-
atrybutu %TYPE Błąd! Nie zdefiniowano zakładki. , określającego typ podanego
przed nim atrybutu relacji. Przykładowo:
osoba pracownicy.nazwisko %TYPE ;
deklaruje zmienną osoba o typie zgodnym z typem atrybutu nazwisko relacji
pracownicy .
Typ rekordowy
Zmienną typu rekord możemy zadeklarować na dwa sposoby:
przy użyciu pseudo-atrybutu %ROWTYPE Błąd! Nie zdefiniowano zakładki. ,
przy użyciu złożonego typu danych RECORD .
Sposób pierwszy umożliwia deklarowanie zmiennych typu rekord, których
struktura jest zgodna ze strukturą krotki relacji lub krotki wyznaczonej przez
tzw. kursor. Przykładowo:
pracownik_rekord
pracownicy% ROWTYPE ;
deklaruje zmienną pracownik_rekord o strukturze zgodnej ze strukturą relacji
pracownicy ; oznacza to, że każde pole zmiennej odpowiada określonemu
atrybutowi relacji. Programista może się odwołać do dowolnego pola tak
zadeklarowanej zmiennej. Przykładowo:
2
 
Język PL/SQL
pracownik_rekord.nazwisko
oznacza odwołanie do pola nazwisko zmiennej pracownik_rekord.
Sposób drugi umożliwia deklarowanie zmiennych typu rekord o dowolnej
strukturze.
declare
type pracownik_rekord1 is record
(imię char (10),
nazwisko pracownicy.nazwisko% TYPE ,
zespoly zespoly.nazwa% TYPE ,
pensja number (6, 2) not null := 900);
deklaruje typ pracownik_rekord1 składający się z czterech pól, których typy
zostały jawnie określone w deklaracji. Pola mogą być opcjonalne lub
obowiązkowe. Pola obowiązkowe deklarujemy za pomocą ograniczenia
integralnościowego not null i obowiązkowo nadajemy im wartości. W
deklaracji typu, pola opcjonalne mogą być również inicjowane wartościami.
Przykładowo:
prac_zesp20
pracownik_rekord1;
deklaruje zmienną typu pracownik_rekord1 .
Typ tablicowy
W celu wykorzystania zmiennej omawianego typu należy najpierw
zadeklarować odpowiedni typ tablicowy, a następnie – samą zmienną. Typ
tablicowy deklarujemy w bloku deklaracji podprogramu, w następujący sposób:
declare
type nazwa_typu is table of typ_kolumny [not null]
index by binary_integer ;
typ_kolumny oznacza jeden z predefiniowanych typów prostych, m. in. char ,
varchar2 , number , date lub typ rekordowy
declare
type Tab_Liczbowa is
table of number
3
 
Język PL/SQL
index by binary_integer ;
-- zmienna typu tablicowego
tablica_liczbowa Tab_Liczbowa;
n binary_integer := 0;
wartość number (2);
Do kolejnych komórek tak zadeklarowanej zmiennej odwołujemy się za pomocą
wyrażenia o następującej składni:
nazwa_zmiennej (numer_komórki);
W poniższym przykładzie, najpierw nadajemy wartość komórce o indeksie 0,
następnie wykorzystujemy pętlę do zainicjowania wartościami numerycznymi
pięciu kolejnych komórek (począwszy od komórki o indeksie 1), na końcu
odczytujemy wartość komórki o indeksie 5.
tablica_liczbowa(0) := 10;
for n in 1..5 loop
tablica_liczbowa(n):=n;
end loop ;
wartość := tablica_liczbowa(5);
Kursory
Każde zapytanie SQL umieszczone w programie PL/SQL jest wykonywane w
tzw. obszarze roboczym Błąd! Nie zdefiniowano zakładki. . PL/SQL
wykorzystuje ten obszar do przechowywania danych otrzymanych w wyniku
zapytania oraz do przechowywania dodatkowych informacji dotyczących stanu
wykonywanego zapytania, tzw. atrybutów . Kursor (ang. cursor) jest
konstruktorem PL/SQL umożliwiającym:
nadanie nazwy temu obszarowi,
dostęp do niego,
pobranie z niego danych,
kontrolę procesu przetwarzania danych.
Wyróżniamy dwa rodzaje kursorów:
jawne Błąd! Nie zdefiniowano zakładki. (ang. explicit) - stosowane w
zapytaniach wyznaczających wiele krotek i w tzw. pętlach z kursorem
(ang. Cursor For Loop),
4
 
Język PL/SQL
niejawne Błąd! Nie zdefiniowano zakładki. (ang. implicit) - stosowane w
pozostałych poleceniach SQL (tj., insert , update , delete ) i poleceniu select
wyznaczającym jedną krotkę.
Kursory jawne
Przed użyciem kursora jawnego należy go najpierw zadeklarować poleceniem
declare Błąd! Nie zdefiniowano zakładki. o następującym formacie:
declare
cursor osoba_kursor is /* deklaracja kursora */
select imię,nazwisko from pracownicy, zespoly
where pracownicy.id_zesp=zespoly.id_zesp
and zespoly.nazwa='BAZY DANYCH';
Otwarcie kursora:
open osoba_kursor;
Pobranie krotki wyznaczonej przez kursor
fetch ... into Błąd! Nie zdefiniowano zakładki.
Przykład :
declare
cursor Błąd! Nie zdefiniowano zakładki. pracownik_kursor is
select nazwisko, placa_pod, id_zesp from pracownicy;
osoba_nazwisko pracownicy.nazwisko %TYPE Błąd! Nie
zdefiniowano zakładki.;
osoba_płaca pracownicy.placa_pod %TYPE ;
osoba_id_zesp pracownicy.id_zesp %TYPE ;
pracownik_dane pracownik_kursor %ROWTYPE Błąd! Nie
zdefiniowano zakładki.;
fetch pracownik_kursor into
osoba_nazwisko, osoba_płaca, osoba_id_zesp;
fetch pracownik_kursor into pracownik_dane;
Polecenie fetch pobiera pojedynczą krotkę. W celu pobrania większej liczby
krotek jest konieczne wielokrotne użycie polecenia fetch (np. w pętli).
Zamknięcie kursora:
close osoba_kursor;
5
 
Zgłoś jeśli naruszono regulamin