background image

1

SBD, L.Banachowski

Oprogramowanie strony 

serwera na przykładzie 

Oracle

Część 1

Wykład 4

background image

2

SBD, L.Banachowski

Aplikacja bazodanowa

•      Tworząc  aplikację,  należy  podjąć  decyzję,  jaka  jej 
część ma się znajdować, na:

•    serwerze bazy danych, 
•        jaka  na  komputerze  użytkownika  (czyli  po 
stronie klienta).

•    Dane oraz mechanizm wykonywania instrukcji SQL 
- po stronie serwera. 

•        “Przyjazny”  interfejs  użytkownika  –  po  stronie 
klienta.

•     Przetwarzanie danych:

•   na serwerze - centralna kontrola nad spójnością 
danych,  

•   na stacji klienckiej - precyzyjniejsza diagnostyka i 
obsługa błędów.

background image

3

SBD, L.Banachowski

Aplikacja bazodanowa

Elementy aplikacji umieszczane po stronie serwera:

1. deklaratywne więzy spójności,  

2. procedury, funkcje i pakiety,  

3. wyzwalacze bazy danych, 

4. procedury/klasy 

(serwlety) 

hipertekstowe 

tworzące dynamiczne strony WWW,

5. rozproszone komponenty jak klasy Javy - EJB.

background image

4

SBD, L.Banachowski

Rozszerzenie języka SQL o elementy 
języka programowania

•    SQL/PSM - Standard SQL:1999
•    Oracle PL/SQL

background image

5

SBD, L.Banachowski

Więzy spójności 

• 

 

 

 

Zadaniem 

więzów 

spójności 

jest 

zagwarantowanie  tego,  aby  dane  w  bazie  danych 
wiernie  odzwierciedlały  świat  rzeczywisty,  dla 
którego baza danych została zaprojektowana. 

•        System  bazy  danych  ma  zapewnić,  aby  więzy 
spójności  pozostawały  prawdziwe  przy  wszystkich 
operacjach  wykonywanych  na  bazie  danych  w 
postaci  transakcji,  wyzwalaczy,  ładowania  danych 
do bazy danych czy ich importu.

background image

6

SBD, L.Banachowski

Deklaratywne więzy 
spójności

•     Więzy spójności mogą być sprawdzane zarówno po 
stronie serwera jak i po stronie klienta:

•            Bardziej  naturalnym  miejscem  sprawdzania 
jest  serwer,  który  obsługuje  wszystkie  możliwe 
aplikacje  utworzone  dla  bazy  danych.  Lepiej  jest 
mieć  jeden  mechanizm  gwarantujący  spełnienie 
więzów  spójności  niż  wiele,  potencjalnie  nie 
spójnych.

•                  Podstawowe  metody  określania  więzów 
spójności na serwerze: 

•    deklaratywne  więzy  spójności  –  w  definicjach 
tabel (instrukcje 

CREATE TABLE

 i 

ALTER TABLE

),

•   wyzwalacz bazy danych,
•  osobny interfejs programistyczny API.

background image

7

SBD, L.Banachowski

Więzy spójności 
encji

Ograniczają możliwe wartości w wierszu tabeli:

        Więzy  klucza  głównego 

PRIMARY  KEY

  –  wartości  w 

określonych  kolumnach  jednoznacznie  identyfikują 
wiersz.  Nie  jest  dopuszczalna  wartość  NULL  w 
kolumnach  klucza  głównego.  Automatycznie  jest 
zakładany  indeks  na  kolumnach  tworzących  klucz 
główny. Tylko jeden klucz główny dla jednej tabeli.

    Więzy klucza jednoznacznego 

UNIQUE

  – wartości w 

określonych  kolumnach  jednoznacznie  identyfikują 
wiersz.  Jest  dopuszczalna  wartość  NULL  w  kolumnach 
klucza  jednoznacznego.  Automatycznie  jest  zakładany 
indeks  na  kolumnach  tworzących  klucz  jednoznaczny. 
Może  być  więcej  niż  jeden  klucz  jednoznaczny  dla 
jednej tabeli.

background image

8

SBD, L.Banachowski

Więzy spójności encji

            Więzy 

NOT  NULL

  –  w  kolumnie  nie  jest 

dozwolona wartość NULL.

            Więzy 

CHECK

  –  warunek,  który  ma  być 

prawdziwy  dla  wszystkich  wierszy  w  tabeli.  Nie 
może  zawierać  podzapytania  ani  funkcji  zmiennych 
w  czasie  jak  Sysdate  lub  User.  Może  zawierać 
nazwy jednej lub więcej kolumn.

background image

9

SBD, L.Banachowski

Więzy spójności 
referencyjnej

•          Zbiór  wartości  w  kolumnach  klucza  obcego  jest 
zawsze  podzbiorem  zbioru  wartości  odpowiadającego 
mu klucza głównego lub jednoznacznego. 

•    Wartością klucza obcego może być NULL – wówczas 
klucz obcy nie wskazuje na żaden obiekt. 

•        System  zapewnia,  aby  obiekt  wskazywany  przez 
wartość klucza obcego zawsze istniał, przy wszystkich 
możliwych  operacjach  na  tabelach,  w  których  biorą 
udział klucze główne, jednoznaczne i obce.

background image

10

SBD, L.Banachowski

Klucze obce

•       Przy  definiowaniu  klucza  obcego  nie  można  się 
odwoływać  ani  do  synonimu  tabeli  ani  do  tabeli 
znajdującej się w innej (odległej) bazie danych. 

•    Nie tworzy się automatycznie indeks.

•        Aby  przyśpieszyć  wyszukiwanie  i  złączanie, 
projektant  bazy  danych  może  sam  zaplanować 
założenie  indeksu  na  kluczu  obcym  przy  użyciu 
instrukcji 

CREATE INDEX

.

background image

11

SBD, L.Banachowski

Składnia więzów w-linii

•   [NOT] NULL
•   {UNIQUE|PRIMARY KEY}
•    CHECK (warunek)
•        REFERENCES  tabela[(kolumna)][ON  DELETE 
CASCADE]

•    REFERENCES  tabela[(kolumna)][ON DELETE SET 
NULL]

background image

12

SBD, L.Banachowski

Składnia więzów-poza-linią

•   {UNIQUE|PRIMARY KEY} (kolumna,…)
•   CHECK (warunek
•    FOREIGN KEY (kolumna,…) REFERENCES 
tabela(kolumna,…)[ON DELETE [CASCADE|SET NULL]]

CONSTRAINT nazwa_więzów 

•    Nadanie nazwy, przy pomocy której można się do 
nich  odwoływać,  np.  włączając  je,  wyłączając  lub 
usuwając.

background image

13

SBD, L.Banachowski

Przykład

CREATE TABLE Pożyczki( 
       Num_konta      NUMBER(6,0),
       Num_pożyczki NUMBER(6,0),
       Typ_pożyczki VARCHAR2(8) 
                           

CONSTRAINT ck_Typ_poż

                           CHECK (Typ_pożyczki IN 
('AUTO', 'DOM', 'OSOBISTE')),
       Wielkość         NUMBER(8,0) 
                                 

CONSTRAINT nn_Wielk 

NOT NULL,
        Data_pożyczki DATE DEFAULT Sysdate,
        Zaakceptowana VARCHAR2(25) 
                                                                   

CONSTRAINT 

ko_Zaakcept 

                                                                    REFERENCES 
Kierownicy (Nazwisko_kier),
        

CONSTRAINT kg_Poż

  PRIMARY KEY(Num_konta, 

Num_pożyczki),
        

CONSTRAINT ko_Num_konta

                          FOREIGN  KEY  (Num_konta)  REFERENCES 
Klienci (Num_konta)
);

background image

14

SBD, L.Banachowski

DEFAULT

                DEFAULT Sysdate

•        Ustala  datę  pożyczki  na  dzień  dzisiejszy,  to 
jest  dzień  wprowadzania  informacji  o  pożyczce 
do bazy danych. 

•      W  specyfikacji  wartości  domyślnej  mogą 
występować  stałe  i  funkcje  SQL  także  User, 
Sysdate. 

•    Nie mogą występować ani nazwy kolumn ani 
funkcje PL/SQL ani sekwencje.

background image

15

SBD, L.Banachowski

CHECK

•   W przypadku warunku występującego w CHECK 
akceptowane są wiersze, których  wartością jest 

                    

TRUE    

lub   

NULL 

  System  nie  pozwala,  aby  w  tabeli  pojawił  się 
wiersz  dający  wartość  FALSE  (sygnalizowany  jest 
błąd).

background image

16

SBD, L.Banachowski

Akcje referencyjne przy DELETE

•   

Jeśli ma być usunięty wiersz tabeli nadrzędnej do którego 

są odwołania przez klucz obcy z tabeli podrzędnej, jest błąd i 
DELETE nie zostaje wykonane. 

•   

ON DELETE CASCADE

 - razem z wierszem tabeli nadrzędnej 

zostają  usunięte  wszystkie  wiersze  tabeli  podrzędnej,  w 
których wartości klucza obcego wskazują na usuwany wiersz, 

•        pod  warunkiem,  że  usunięcie  tych  wierszy  jest 
możliwe bez naruszenia innych więzów referencyjnych.

•   

ON DELETE SET NULL

 - przy usuwaniu wiersza, do którego 

są  odwołania  przez  wartości  kluczy  obcych,  następuje 
wstawienie  pseudo-wartości  NULL  jako  wartości  klucza 
obcego. 

background image

17

SBD, L.Banachowski

Inne akcje referencyjne 
Standardu (nie realizowane 
przez Oracle)

•    

ON DELETE SET DEFAULT

 – oznaczająca 

wstawienie wartości domyślnej jako wartości klucza 
obcego;

•    

ON UPDATE [CASCADE|SET NULL|SET DEFAULT]

     

  W  Oracle  można  je  zaprogramować  za  pomocą 
wyzwalaczy  bazy  danych,  pod  warunkiem,  że  nie 
zdefiniujemy deklaratywnych więzów klucza obcego.

background image

18

SBD, L.Banachowski

CHECK

•   Gdy klucz obcy składa się z kilku kolumn i w jednej z 
nich  jest  wartość  NULL,  wtedy  system  akceptuje  taką 
wartość wiersza bez żadnych dodatkowych sprawdzeń. 

•   Gdybyśmy chcieli realizować semantykę polegającą 
na  tym,  że  albo  wszystkie  wartości  klucza  obcego  są 
NULL  albo  żadna  z  nich  nie  jest,  wówczas  należałoby 
zagwarantować  to  za  pomocą  odpowiedniego  warunku 
CHECK np. :

 

CONSTRAINT A_B_ck CHECK (((A IS NOT NULL) AND 
(B IS NOT NULL)) OR((A IS NULL) AND (B IS NULL)))

background image

19

SBD, L.Banachowski

Operacje na więzach 

ALTER TABLE Emp
ADD  (CONSTRAINT  Sal_ck  CHECK  (sal 
>5000));

 

ALTER TABLE Emp
ENABLE CONSTRAINT Sal_ck;

 
ALTER TABLE Emp
DISABLE CONSTRAINT Sal_ck; 

ALTER TABLE emp
DROP CONSTRAINT Sal_ck;

Więzy  klucza  głównego  i 
jednoznacznego 

można 

włączać, 

wyłączać 

usuwać 

używając 

ich 

naturalnych nazw PRIMARY 
KEY i UNIQUE.

background image

20

SBD, L.Banachowski

SQL*Plus – prosty interfejs do 
bazy danych

•       

SET  AUTOCOMMIT  ON

  –  wykonywanie  operacji 

zatwierdzania COMMIT po każdej zmianie danych (a nie 
tylko na koniec pomyślnej transakcji);

•     

HOST  polecenie

  –  wykonanie  polecenia  systemu 

operacyjnego;

•       

EXIT

  –  zakończenie  sesji  SQL*Plus  – 

wylogowanie się z Oracle;

•       

DESCRIBE  nazwa

  –  wyświetlenie  schematu 

obiektu  (tabeli,  perspektywy,  procedury,  funkcji)  o 
podanej nazwie;

•       

EXECUTE  nazwa_procedury  (...) 

–  wykonanie 

procedury.

background image

21

SBD, L.Banachowski

Pliki w SQL*Plus

•    

START nazwa_pliku

 – wykonaj skrypt poleceń SQL 

i SQL*Plus zapisany w pliku o podanej nazwie (zamiast 
START można użyć@);

•       

ED  nazwa_pliku

  –  wywołaj  standardowy  edytor 

(np. notepad albo vi);

•       

SPOOL  nazwa_pliku

  –  zapisuj  kolejne  polecenia  i 

ich wyniki w pliku o podanej nazwie;

•       

SPOOL  OFF

  –  zamknij  poprzednio  otwarty  przez 

SPOOL plik.

background image

22

SBD, L.Banachowski

Formatowanie w SQL*Plus

•       

COLUMN  nazwa  FORMAT  An

  –  szerokość 

wyświetlania kolumny napisowej o podanej nazwie;

•     

COLUMN  nazwa  FORMAT  99999

  –  szerokość 

wyświetlania  kolumny  liczbowej  o  podanej  nazwie  (9 
reprezentuje jedną cyfrę);

•   

SET PAGESIZE 

– ustalenie długości jednej strony 

na linii;

•     

SET  PAUSE  ON

  –  zatrzymywanie  przewijania 

wyświetlania  wyników  po  wyświetleniu  zawartości 
ekranu;

background image

23

SBD, L.Banachowski

Zmienne w SQL*Plus

•     

VARIABLE  X  NUMBER

  (lub 

CHAR(n)

  lub 

VARCHAR(n)

n>0) – deklaracja zmiennej wiązania;

•   

EXECUTE :X:= wyrażenie;

 – przypisz zmiennej 

wiązania 

:X

 wartość wyrażenia. Po ustaleniu wartości 

można  zmienne  wiązania  poprzedzone  dwukropkiem 
używać w instrukcjach SQL i PL/SQL.

•   

PRINT X

 – wypisz wartość zmiennej wiązania X;

•     

ACCEPTZmienna  PROMPT  'Podaj  wartość 

zmiennej: '

 -   utworzenie zmiennej podstawienia i 

wczytanie  na  nią  wartości.  Następnie  można  zmienne 
podstawienia  poprzedzone  znakiem  &  używać  w 
instrukcjach SQL i PL/SQL.

background image

24

SBD, L.Banachowski

Język PL/SQL

Język 

PL/SQL

  jest  proceduralnym  rozszerzeniem 

języka  SQL  i  stanowi  podstawę  do  pisania  aplikacji 
Oracle  –  jest  mianowicie  dostępny  w  różnych 
programach narzędziowych ORACLE np. 

1. SQL*Plus, 

2. Developer 2000 (Oracle*Forms i Oracle*Reports), 

3. prekompilatory, 

4. procedury, 

5. wyzwalacze, 

6. aplikacje na stronach WWW. 

background image

25

SBD, L.Banachowski

Blok anonimowy

DECLARE
             

deklaracje  obiektów  PL/SQL  jak  zmienne,  stałe, 

wyjątki,  procedury, funkcje

  BEGIN
       

ciąg instrukcji do wykonania

  EXCEPTION
       

obsługa wyjątków (błędów)

END;

•   Deklaracje  i  obsługa  wyjątków  są  opcjonalne.  Bloki 
mogą być zagnieżdżone. 

•      Instrukcje  SQL  w  bloku  PL/SQL:  SELECT,  INSERT, 
UPDATE, DELETE, COMMIT i ROLLBACK.

background image

26

SBD, L.Banachowski

Przykład

DECLARE
   v_stan NUMBER(5);

BEGIN
      SELECT  Stan  INTO  v_stan  FROM 
Magazyn
                              WHERE  Produkt  = 
'Fiat'; 
   IF v_stan > 0  THEN
         UPDATE Magazyn SET Stan = 
Stan - 1
        WHERE Produkt = 'Fiat';
        INSERT INTO Zakupy
                VALUES  ('Kupiono  Fiata', 
Sysdate);
  ELSE
       INSERT INTO Zakupy
            VALUES  ('Brak  Fiatów', 
Sysdate);
  END IF;
  COMMIT;

EXCEPTION 
  WHEN  no_data_found  THEN 
       
     INSERT INTO dziennik
     VALUES('Nie znaleziono 
FIATa');
END;

background image

27

SBD, L.Banachowski

Komentarze

•      między nawiasami /*    i    */ , albo
•       od dwóch kresek -- do końca bieżącej linii.

background image

28

SBD, L.Banachowski

Deklaracje zmiennych i 
stałych

v_zarobki NUMBER(7,2);

pi CONSTANT NUMBER(7,5) := 3.14159;

v_nazwisko VARCHAR2(25) := 'Kowalski';

v_data DATE := Sysdate;

żonaty BOOLEAN := False;

liczba_dzieci BINARY_INTEGER :=0;

background image

29

SBD, L.Banachowski

Deklaracje zmiennych i 
stałych

•    Deklaracji zmiennych tych samych typów nie można 
łączyć razem jak w innych językach!

•      W  PL/SQL  są  dostępne  typy  danych  z  języka  SQL  a 
ponadto m.in.

•   

BOOLEAN

 - wartości logiczne,  

•     

BINARY_INTEGER 

-  typ  liczb  całkowitych  – 

niezależny  od  podtypów  typu  NUMBER  i  przez  to 
wymagający  przy  zapisie  mniej  miejsca  w  pamięci 
RAM. 

•      Nie  należy  zmiennej  nadawać  tej  samej  nazwy  co 
kolumnie w tabeli.

•      Wewnątrz  bloku  PL/SQL  instrukcja  SELECT  nie 
wypisuje wyników na ekran (ani do pliku).

•      Zmienne  i  stałe  PL/SQL  mogą  występować  w 
instrukcjach SQL. 

background image

30

SBD, L.Banachowski

Wprowadzanie danych z 
klawiatury i wypisywanie na 
ekran

SET ServerOutput ON

ACCEPT rocz_zarob PROMPT 'Podaj roczne zarobki: '

DECLARE

     mies  NUMBER(9,2) := &rocz_zarob;

BEGIN

     mies := mies/12;

    DBMS_OUTPUT.PUT_LINE ('Miesięczne zarobki =  ' 
||mies);

END;

/

background image

31

SBD, L.Banachowski

Wprowadzanie danych z 
klawiatury i wypisywanie na 
ekran

ACCEPT rocz_zarob PROMPT 'Podaj roczne 
zarobki: '

VARIABLE mies NUMBER

BEGIN

  :mies := &rocz_zarob/12;

END;

/

PRINT Mies

background image

32

SBD, L.Banachowski

Zmienne systemowe

•   

SQL%ROWCOUNT

 -- liczba wierszy przetworzonych 

przez ostatnią instrukcję SQL;

•   

SQL%FOUND

 = TRUE jeśli został znaleziony 

(przetworzony) przynajmniej jeden wiersz;

•   

SQL%NOTFOUND

 = TRUE jeśli żaden wiersz nie 

został znaleziony (przetworzony);

•   

SQLERRM

 - tekstowa informacja o błędzie;

•   

SQLCODE

 - kod błędu. 

Obu zmiennych SQLERRM i SQLCODE można używać 
tylko w sekcji EXCEPTION!

background image

33

SBD, L.Banachowski

Przykład

•           

Przykład  użycia  zmiennej  SQL%ROWCOUNT  do 

obliczenia liczby usuwanych działów o numerze 50:

 
DECLARE usunięte NUMBER;
 BEGIN
         DELETE FROM Dept WHERE Deptno = 50;
         usunięte := SQL%ROWCOUNT;
         INSERT INTO Dziennik 
                  VALUES  ('Dział',  usunięte, 
Sysdate);
 END;

background image

34

SBD, L.Banachowski

Instrukcja SELECT w PL/SQL

Aby instrukcja  była  poprawna,  instrukcja  SELECT … 
INTO  musi  zwracać  dokładnie  jeden  wiersz 
wyników!

    SELECT Ename
    INTO v_ename
    FROM Emp
    WHERE Empno = 1030;

 Wartości w bloku PL/SQL, pochodzą na ogół z bazy 
danych,  gdzie  został  określony  ich  typ  danych.  W 
związku  z  tym,  wygodnie  jest  określać  typ  danych 
jako ''typ danych wymienionej kolumny'' np.

         

Emp.Ename%TYPE

background image

35

SBD, L.Banachowski

Standardowe, nazwane 
wyjątki 

•      

dup_val_on_index

 (ta sama wartość 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),

•     

invalid_number

 (niepoprawna konwersja na 

liczbę). 

background image

36

SBD, L.Banachowski

Wyjątki

…..  

SELECT Ename, Job   INTO v_ename, v_job

  …..

EXCEPTION
   WHEN 

no_data_found 

 THEN

INSERT  INTO  Dziennik  VALUES  ('Nikt  nie  zatrudniony 

w 1993');

DBMS_OUTPUT.Put_line('Nikt nie zatrudniony w 93');

   WHEN 

too_many_rows

  THEN

INSERT  INTO  Dziennik  VALUES  ('Więcej  niż  1 

zatrudniony w 1993');

DBMS_OUTPUT.Put_line('Więcej niż 1 w 93');

  WHEN 

OTHERS 

 THEN     -- Obsługa pozostałych błędów 

komunikat := 'Błąd nr.=  ' ||
                                                            SQLCODE||  ', 

komunikat=  ' || Substr(SQLERRM,1,100);
  

            -- SQLCODE i SQLERRM nie mogą wystąpić 

w instrukcji SQL!
      INSERT INTO Dziennik VALUES (komunikat);
      DBMS_OUTPUT.Put_line(‘Wystąpił inny błąd ');
 END;

background image

37

SBD, L.Banachowski

Obsługa wyjątków

•      Jeśli  blok,  w  którym  wystąpił  błąd,  zawiera 
obsługę  tego  błędu,  to  po  dokonaniu  obsługi, 
sterowanie  jest  w  zwykły  sposób  przekazywane  do 
bloku go zawierającego (nadrzędnego). 

•    Jeśli nie zawiera, następuje przekazanie błędu do 
bloku  zawierającego  dany  blok  i  albo  tam  nastąpi 
jego  obsługa  albo  błąd  przechodzi  do  środowiska 
zewnętrznego.

background image

38

SBD, L.Banachowski

Obsługa wyjątków

•        Błąd,  który  wystąpił  w  sekcji  wykonawczej  bloku 
(między  BEGIN  i  END)  jest  obsługiwany  w  sekcji 
EXCEPTION tego samego bloku. Błędy, które wystąpią w 
sekcji deklaracji lub w sekcji wyjątków są przekazywane 
do bloku zawierającego dany blok.

•    Dobra praktyka programistyczna wymaga aby każdy 
błąd  został  obsłużony  –  ewentualnie  w  klauzuli  WHEN 
OTHERS THEN najbardziej zewnętrznego bloku. 

•        Aby  móc  stwierdzić,  która  instrukcja  SQL 
spowodowała błąd:

•      można  używać  podbloków  z  własną  obsługą 
błędów, albo 

•        można  używać  licznika,  zwiększającego  się  o 
jeden po wykonaniu każdej instrukcji SQL.

background image

39

SBD, L.Banachowski

Instrukcje warunkowe

IF    warunek    THEN    ciąg_instrukcji   
END IF;

  IF  warunek  THEN  
           ciąg_instrukcji
  ELSE  
          ciąg_instrukcji  
  END IF;
 
 IF  warunek  THEN  
    ciąg_instrukcji
 ELSIF  warunek  THEN 
  ciąg_instrukcji  
END IF;

 

•        Instrukcje  po  THEN  są 
wykonywane 

wtedy, 

gdy 

wartością warunku jest TRUE. 

•          Instrukcje  po  ELSE  są 
wykonywane 

wtedy, 

gdy 

wartością  warunku  jest  FALSE 
lub NULL. 

background image

40

SBD, L.Banachowski

Instrukcje iteracji

LOOP
     ciąg  instrukcji (w tym   EXIT lub   EXIT   WHEN  
warunek)
END LOOP;
 
FOR  zmienna IN  wartość1 ..  wartość2
LOOP   …  END LOOP;
 
WHILE  warunek
LOOP …   END LOOP;

background image

41

SBD, L.Banachowski

Instrukcja pusta

Null

  –  na  przykład,  gdy  obsługa  wyjątku  jest 

pusta.

background image

42

SBD, L.Banachowski

Zmienne wierszowe

DECLARE
     rek_osoby Emp%ROWTYPE;     /* Typ wierszowy 
*/
BEGIN
    SELECT * INTO rek_osoby 
          FROM Emp WHERE Ename = 'KOWALSKI';
    rek_osoby.Sal := 1.1*rek_osoby.Sal;
    INSERT INTO Dziennik 
      VALUES (rek_osoby.Ename, rek_osoby.Job, 
                                                
                    rek_osoby.Sal, SYSDATE);
END;

Zmiennej wierszowej nie można użyć bezpośrednio 
po  słowie  kluczowym  VALUES  w  instrukcji  INSERT 
INTO!

background image

43

SBD, L.Banachowski

Rekordy PL/SQL, zmienne 
rekordowe

TYPE Typ_rek_prac IS RECORD
    ( numer_prac NUMBER(4) NOT NULL,
            nazwisko          VARCHAR2(40)  NOT 

NULL,

      zarobki        NUMBER(8,2),

 

      num_działu NUMBER(4));
rekord_prac Typ_rek_prac;

Typy rekordowe mogą być zagnieżdżone. Dostęp do 
pól rekordu jest przy pomocy notacji kropkowej. Na 
zmienną  rekordową  można  przypisać  wartość  innej 
zmiennej  rekordowej,  ale  tylko  tego  samego  typu 
rekordowego.  Można  ich  używać  w  klauzuli  INTO 
(tak jak zmiennych wierszowych):

                       

SELECT * INTO rekord_prac

                       FROM Pracownicy
                       WHERE Id_prac = 

12;

background image

44

SBD, L.Banachowski

Wyjątki definiowane przez 
programistę

Wyjątki  można  deklarować  samemu  (w  sekcji 
DECLARE) używając słowa kluczowego EXCEPTION

nazwa_wyjątku EXCEPTION;

powodować ich podniesienie (w sekcji instrukcji) 

RAISE nazwa_wyjątku;

a następnie je obsługiwać (w sekcji EXCEPTION)

WHEN nazwa_wyjątku THEN ...

background image

45

SBD, L.Banachowski

Przykład

DECLARE
      

brak_w_magazynie

 

EXCEPTION

;

      v_liczba NUMBER(5);
BEGIN
   SELECT Liczba
      INTO v_liczba
            FROM  Magazyn  WHERE  Marka  = 
'Fiat';
   IF v_liczba < 1  THEN
            

RAISE

 

brak_w_magazynie

;

   END IF;

EXCEPTION

    WHEN 

brak_w_magazynie

  THEN

                    INSERT  INTO  Zamówienia 
VALUES ('Fiaty');
          

RAISE

 wyjście;

END; 

background image

46

SBD, L.Banachowski

Podnoszenie wyjątku za pomocą 
Raise_Application_Error

•      Przypisanie  mu  numeru  między  –20000  a  –20999  i 
tekstu. 

•      Wyjątek  taki  może  zostać  obsłużony  albo  w  tym 
samym  bloku  albo  w  aplikacji  zewnętrznej,  w  której  to 
wywołanie zostanie wykonane.

DECLARE
      numer INTEGER;
BEGIN     .....
       

Raise_Application_Error(-20100,'Błąd');

EXCEPTION
  WHEN OTHERS THEN
         numer:=SQLCODE;
         IF numer= -20100 THEN           
               Dbms_output.Put_line('Błąd 
przechwycony!');
         END IF;
END;

background image

47

SBD, L.Banachowski

Obsługa błędów 
przechwytywanych przez serwer 
bazy danych

Nadanie  nazwy  wyjątkowi  systemowemu  -  w  sekcji 
deklaracji 

 

nazwa_wyjątku EXCEPTION;

 

PRAGMA 

EXCEPTION_INIT 

(

nazwa_wyjątku

numer_błędu); 

a następnie obsługa (w sekcji EXCEPTION)

WHEN nazwa_wyjątku THEN ...

background image

48

SBD, L.Banachowski

Przykład

Przykład obsługi błędu naruszenia więzów klucza 
obcego nr  -2292:

DECLARE
       

bl_klucz_o

 

EXCEPTION;

       PRAGMA EXCEPTION_INIT (

bl_klucz_o

, -2292);

       v_deptno Dept.Deptno%TYPE := :b_deptno;
BEGIN
     DELETE FROM Dept
      WHERE Deptno = v_deptno;
    COMMIT;
EXCEPTION
    WHEN 

bl_klucz_o

 THEN

          Dbms_output.Put_line ('Nie można usunąć działu 
' ||  
                                                
To_Char(v_deptno) || ', w którym są pracownicy. ');
END;

background image

49

SBD, L.Banachowski

Etapy budowy systemu 

informatycznego dla 

przedsiębiorstwa

1

.

 

To, co klient 

zamówił

background image

50

SBD, L.Banachowski

Etapy budowy systemu 

informatycznego dla 

przedsiębiorstwa

2

. To, co 

analityk 
zrozumiał

background image

51

SBD, L.Banachowski

Etapy budowy systemu 

informatycznego dla 

przedsiębiorstwa

3

. To, co 

opisywał 
projekt

background image

52

SBD, L.Banachowski

Etapy budowy systemu 

informatycznego dla 

przedsiębiorstwa

4

. To, co 

wykonali 
programiści

background image

53

SBD, L.Banachowski

Etapy budowy systemu 

informatycznego dla 

przedsiębiorstwa

5

. Projekt po 

uruchomieniu 
i wdrożeniu

background image

54

SBD, L.Banachowski

Etapy budowy systemu 

informatycznego dla 

przedsiębiorstwa

6

. To, za co 

klient zapłacił

background image

55

SBD, L.Banachowski

Etapy budowy systemu 

informatycznego dla 

przedsiębiorstwa

7

. A to, czego 

klient 
potrzebował

background image

56

SBD, L.Banachowski


Document Outline