książka znaleziono
Transkrypt
książka znaleziono
Przetwarzanie wyników zapytań
SELECT wyrażenie
INTO nazwa_zmiennej | nazwa_rekordu
FROM tabela
WHERE warunek;
BAZY DANYCH
W APLIKACJACH
SIECIOWYCH
DECLARE
v_sred NUMBER(4);
BEGIN
SELECT AVG(cena) INTO v_sred
FROM ksiazka;
END;
/
Wykład 3
Kursory.
(Wybrane materiały)
Dr inż. E. Busłowska
Copyright © 2014-2015 E. Busłowska
1
SQL%ROWCOUNT - liczba wierszy
zmodyfikowanych przez polecenie
SQL%FOUND -TRUE jeśli ostatnie polecenie
zmodyfikowało jakiekolwiek wiersze
SQL%NOTFOUND - TRUE jeśli ostatnie
polecenie nie zmodyfikowało żadnych
wierszy
SQL%ISOPEN - zawsze FALSE (kursor
niejawny jest zamykany natychmiast po
zakończeniu polecenia)
ACCEPT p_cena PROMPT ‘Podaj wartosc ceny: ’
VARIABLE g_cena NUMBER
DECLARE
v_cena NUMBER := &p_cena;
BEGIN
:g_cena := v_cena*1.1;
END;
/
SQL>PRINT g_cena
3
Copyright © 2014-2015 E. Busłowska
4
Atrybuty kursorów niejawnych
Atrybuty kursorów niejawnych
PROCEDURE KASUJ_KSIAZKE (p_isbn t_ksiazka.isbn%TYPE)
IS
BEGIN
DELETE FROM t_ksiazka
WHERE isbn = p_isbn;
IF SQL%NOTFOUND THEN
dbms_output.put_line(‘Nie znaleziono rekordu’);
END IF;
END;
Copyright © 2014-2015 E. Busłowska
2
Atrybuty kursora niejawnego
Polecenia SQL*Plus - przykład
Copyright © 2014-2015 E. Busłowska
Copyright © 2014-2015 E. Busłowska
5
BEGIN
UPDATE ksiazka
SET cena = 1.1*cena
WHERE isbn = ∥
IF SQL%NOTFOUND THEN
dbms_output.put_line('Nie znaleziono rekordu');
END IF;
END;
/
Copyright © 2014-2015 E. Busłowska
6
1
Otwieranie kursora
Deklaracja kursora jawnego
OPEN nazwa_kursora [ (lista parametrów aktualnych) ]
DECLARE CURSOR nazwa_kursora [lista
parametrów]
IS
SELECT pole1, pole2,...
FROM nazwa_tabeli...;
DECLARE
CURSOR c_klient_s
IS
SELECT nazwisko, imie
FROM t_klient
WHERE wojewodztwo = ‘Podlaskie’; ...
Copyright © 2014-2015 E. Busłowska
7
DECLARE CURSOR c_prac (w VARCHAR2, m VARCHAR2)
IS
SELECT *
FROM t_klient
WHERE wojewodztwo = w AND miasto= m;
BEGIN ...
OPEN c_prac('Podlaskie', 'Bialystok');
Lub
v_woj := 'Podlaskie';
v_mias:='Bialystok' ...
OPEN c_prac(v_woj, v_mias); ...
Copyright © 2014-2015 E. Busłowska
8
Pobieranie danych
FETCH nazwa_kursora INTO lista zmiennych | rekord;
SELECT POLE1,
POLE2
Atrybuty kursora jawnego
/*w deklaracji kursora */
INTO ZMIENNA1, ZMIENNA2
SQL> DECLARE
2 v_tytul t_ksiazka.tytul%TYPE ;
3 v_rokwydania t_ksiazka.rok_wydania%TYPE;
4 v_cena t_ksiazka.cena%TYPE;
5
6 CURSOR c_ksiazki_wyd IS Select tytul, rok_wydania, cena
7 FROM t_ksiazka
8 WHERE wydawca =3;
9
10 BEGIN
11 OPEN c_ksiazki_wyd;
12 LOOP
13 FETCH c_ksiazki_wyd INTO v_tytul, v_rokwydania, v_cena; ...
/*w instrukcji FETCH */
Copyright © 2014-2015 E. Busłowska
9
· %NOTFOUND - TRUE, jeśli ostatni rozkaz
FETCH zakończył się niepowodzeniem z
powodu braku rekordów
· %FOUND - TRUE, jeśli ostatni rozkaz
FETCH zakończył się sukcesem
· %ROWCOUNT - liczba rekordów w
kursorze (po otwarciu kursora)
· %ISOPEN - TRUE, jeśli kursor jest otwarty
Copyright © 2014-2015 E. Busłowska
10
Kursor w pętli
Dostęp do atrybutu kursora
SQL> DECLARE
2 CURSOR k_cursor IS SELECT * FROM t_z_ksiazka WHERE isbn = 5;
3 v_ilosc t_z_ksiazka.ilosc%TYPE:=0;
4 k_record t_z_ksiazka%ROWTYPE;
5
6 BEGIN
7 OPEN k_cursor;
8 LOOP
9 FETCH k_cursor INTO k_record;
10
11 EXIT WHEN (k_cursor%NOTFOUND);
12 v_ilosc := v_ilosc + k_record.ilosc;
13 Dbms_output.put_line('rekord '|| k_cursor%ROWCOUNT||' ilość
'||k_record.ilosc);
14 END LOOP ;
15 dbms_output.put_line('Razem: '||v_ilosc);
16 CLOSE k_cursor;
17 END;
18 /
Nazwa_kursora% NAZWA_ATRYBUTU
Nazwa_kursora% FOUND
Nazwa_kursora% NOTFOUND
IF Nazwa_kursora% ROWCOUNT>4 THEN...
/* odczytano ponad 4 rekordy */
IF Nazwa_kursora% ISOPEN THEN...
/* jeśli kursor jest otwarty pobierz rekord */...
/* w przeciwnym razie otwórz kursor*/
Copyright © 2014-2015 E. Busłowska
11
Copyright © 2014-2015 E. Busłowska
12
2
Niejawna deklaracja rekordu w pętli
FOR dla kursora
Definicja rekordu
SQL> DECLARE
2 CURSOR c_kswy IS
3 select isbn,tytul,cena,nazwa_wydawcy
4 from t_ksiazka k, t_wydawca w
5 where k.wydawca=w.id_wydawcy;
6 BEGIN
7 FOR ks IN c_kswy
8 LOOP
9 DBMS_OUTPUT.PUT_LINE(c_kswy%ROWCOUNT || ' '||
ks.isbn||' ' ||ks.tytul|| ' '|| ks.cena|| '
'||ks.nazwa_wydawcy);
10 END LOOP;
11 END;
12 /
1 5 Imperium 35 Czytelnik
Procedura PL/SQL została zakończona pomyślnie.
DECLARE
CURSOR c_ksiazki IS SELECT ISBN, tytul
FROM t_ksiazki;
REC_ks c_ksiazki %ROWTYPE
...
FETCH c_ksiazki INTO REC_ks;
Copyright © 2014-2015 E. Busłowska
13
Copyright © 2014-2015 E. Busłowska
14
Kursory sparametryzowane
Anonimowe pętle
kursor - FOR
SQL> DECLARE
2 CURSOR c_wydks (adr VARCHAR2, opr VARCHAR2)
3 IS
4 SELECT nazwa_wydawcy, tytul, rok_wydania
5 from t_ksiazka k, t_wydawca w
6 where k.wydawca=w.id_wydawcy AND adres=adr AND oprawa=opr;
7
8 v_nazwa t_wydawca.nazwa_wydawcy%TYPE;
9 v_tytul t_ksiazka.tytul%TYPE;
10 v_rok t_ksiazka.rok_wydania%TYPE;
11
12 BEGIN
13 open c_wydks('W-wa','twarda');
14 LOOP
15 FETCH c_wydks INTO v_nazwa, v_tytul, v_rok;
16 EXIT WHEN c_wydks%NOTFOUND;
17
DBMS_OUTPUT.PUT_LINE(c_wydks%ROWCOUNT || ' '|| v_nazwa||' '||v_tytul||' ' ||v_rok);
18 END LOOP;
19 close c_wydks;
20 END;
21 /
1 Czytelnik Imperium 95
2 Czytelnik Pachnidlo 97
3 Znak Mercedes Benz 01
4 Czytelnik Cesarz 78
Procedura PL/SQL została zakończona pomyślnie.
SQL> BEGIN
2 FOR rec_klient IN (select nazwisko,imie, miejscowosc
3 from t_klient where miejscowosc='B-stok')
4 LOOP
5 DBMS_OUTPUT.PUT_LINE(rec_klient.nazwisko||'
'||rec_klient.imie||
6 ' '||rec_klient.miejscowosc);
7 END LOOP;
8 END;
9 /
Marzec Anna B-stok
Kepinski Adam B-stok
Procedura PL/SQL została zakończona pomyślnie.
Copyright © 2014-2015 E. Busłowska
15
Kursor SELECT FOR UPDATE
16
Deklaracja zmiennej kursora
SQL> DECLARE
2 TYPE REF_KURS IS REF CURSOR;
3 R_K REF_KURS;
4 REC_K t_autor%ROWTYPE;
5
6 BEGIN
7 OPEN R_K FOR 'SELECT * FROM t_autor';
8 LOOP
9 FETCH R_K INTO REC_K;
10 EXIT WHEN R_K%NOTFOUND;
11 DBMS_OUTPUT.PUT_LINE('Autor '|| ' ' ||REC_K.nazwisko);
12 END LOOP;
13 CLOSE R_K;
14 END;
15 /
Autor Heller
Autor Suskind
Autor Kapuscinski
Autor Kundera
Autor Huelle
Procedura PL/SQL została zakończona pomyślnie.
SQL> DECLARE
2 CURSOR c_modkl IS
3 SELECT * FROM t_n_klient WHERE miejscowosc='B-stok'
4 FOR UPDATE OF nazwisko;
5
6 v_nazw t_n_klient.nazwisko%TYPE;
7 BEGIN
8 FOR ks IN c_modkl LOOP
9
v_nazw:=UPPER(ks.nazwisko);
10
UPDATE t_n_klient SET nazwisko=v_nazw
11
WHERE CURRENT OF c_modkl;
12
END LOOP;
13 COMMIT;
14 END;
15 /
Procedura PL/SQL została zakończona pomyślnie.
SQL> select nazwisko from t_n_klient WHERE miejscowosc='B-stok';
NAZWISKO
--------------MARZEC
KEPINSKI
Copyright © 2014-2015 E. Busłowska
Copyright © 2014-2015 E. Busłowska
17
Copyright © 2014-2015 E. Busłowska
18
3