Język PL/SQL. Rozdział 2. Kursory

Podobne dokumenty
Kursor jawny. Rozdział 10a Kursory. Deklarowanie kursora (1) Deklarowanie kursora (2)

Kursor. Rozdział 10a Kursory. Otwieranie kursora. Deklarowanie kursora

Kursory i wyjątki. (c) Instytut Informatyki Politechniki Poznańskiej 1

Deklarowanie kursora

Oracle PL/SQL. Paweł Rajba.

Materiały. Technologie baz danych. Plan wykładu Kursory. Wykład 5: Kursory jawne. Podprogramy. Kursory jawne. Kursory niejawne

1 Kursory 1. 2 Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków...

Plan wykładu BAZY DANYCH II WYKŁAD 4. Co to jest kursor? Rodzaje kursorów

Deklarowanie kursora. CURSOR nazwa [ ( param1 typ1 [,param2 typ2]... ) ] [RETURN typ zwracany] IS zapytanie SQL;

DECLARE <nazwa_zmiennej> typ [(<rozmiar> )] [ NOT NULL ] [ { := DEFAULT } <wartość> ];

Bazy danych wykład dwunasty PL/SQL, c.d. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, wykładwarszawa)

Procedury i funkcje składowane

PL/SQL. Zaawansowane tematy PL/SQL

PODSTAWY BAZ DANYCH 13. PL/SQL

Plan wykładu Projekt fizyczny bazy danych Wprowadzenie PL/SQL PL/SQL Cechy PL/SQL

Kursory - pobieranie danych z baz danych do programów PL/SQL

Język PL/SQL. Rozdział 5. Pakiety podprogramów. Dynamiczny SQL

Plan wykładu PL/SQL. PL/SQL - historia TWORZENIE APLIKACJI BAZODANOWYCH

Plan wykładu BAZY DANYCH II WYKŁAD 3. Zasięg zmiennych. Zasięg zmiennych

Październik Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska. Systemy baz danych - wykład III. dr inż.

Język PL/SQL Procedury i funkcje składowane

Programowanie w SQL. definicja bloku instrukcji BEGIN...END, warunkowe wykonanie instrukcji IF...ELSE, wyrażenie CASE,

Wprowadzenie do języka PL/SQL. Rozdział 9 Język PL/SQL Wprowadzenie. Struktura blokowa programu. Przykładowy program w PL/SQL

Język PL/SQL. Rozdział 1. Wprowadzenie do języka PL/SQL

Język PL/SQL. Rozdział 3. Obsługa błędów wykonania Wyjątki predefiniowane i użytkownika, zgłaszanie i obsługa wyjątków.

1. ELEMENTY JĘZYKA PL/SQL

Kursory. A. Pankowska 1

Procedury wyzwalane. (c) Instytut Informatyki Politechniki Poznańskiej 1

Bloki anonimowe w PL/SQL

Język SQL. Rozdział 8. Język manipulowania danymi DML

Język PL/SQL Wprowadzenie

Kolekcje Zbiory obiektów, rodzaje: tablica o zmiennym rozmiarze (ang. varray) (1) (2) (3) (4) (5) Rozszerzenie obiektowe w SZBD Oracle

Ćwiczenie 12 PL/SQL. Język PL/SQL kursory i wyjątki

Bloki anonimowe w PL/SQL

Zaawansowane bazy danych i hurtownie danych semestr I

Język PL/SQL Wprowadzenie

Język SQL. Rozdział 6. Podzapytania Podzapytania proste i skorelowane, podzapytania w klauzuli SELECT i FROM, operatory ANY, ALL i EXISTS.

w PL/SQL bloki nazwane to: funkcje, procedury, pakiety, wyzwalacze

Oracle PL/SQL. Paweł Rajba.

Język SQL. Rozdział 5. Połączenia i operatory zbiorowe

Administracja i programowanie pod Microsoft SQL Server 2000

Język PL/SQL. Rozdział 6. Procedury wyzwalane

Podprogramy. Rozdział 11 Procedury i funkcje składowane

Język PL/SQL. Rozdział 4. Procedury i funkcje składowane

Język SQL. Rozdział 8. Język manipulowania danymi DML zadania

Podzapytania. Rozdział 5. Podzapytania. Podzapytania wyznaczające wiele krotek (1) Podzapytania wyznaczające jedną krotkę

Paweł Rajba

Procedury wyzwalane. Rozdział 13. Procedury wyzwalane. Cele stosowania procedur wyzwalanych. Definiowanie procedury wyzwalanej DML

Cheatsheet PL/SQL Andrzej Klusiewicz 1/9

Wprowadzenie do języka PL/SQL. Rozdział 9 Język PL/SQL Wprowadzenie. Struktura blokowa programu. Przykładowy program w PL/SQL

Podzapytania. Rozdział 5. Podzapytania. Podzapytania wyznaczające wiele krotek (1) Podzapytania wyznaczające jedną krotkę

Podzapytania. Rozdział 5. Podzapytania. Podzapytania wyznaczające wiele krotek (1) Podzapytania wyznaczające jedną krotkę

Wyzwalacz - procedura wyzwalana, składowana fizycznie w bazie, uruchamiana automatycznie po nastąpieniu określonego w definicji zdarzenia

Ćwiczenie rozpocznie się od wprowadzenia do laboratorium, po którym omówimy składnię ę polecenia INSERT pozwalającego ą na wstawianie krotek do

Oracle Developer Suite. Budowa aplikacji użytkownika końcowego

PL/SQL. Lidia Małkiewicz i Cezary Skubała

Język SQL. Rozdział 7. Zaawansowane mechanizmy w zapytaniach

Język SQL. Rozdział 2. Proste zapytania

Optymalizacja poleceń SQL Wprowadzenie

Plan wykładu BAZY DANYCH II WYKŁAD 5. Kolekcje. Tablice asocjacyjne Kolekcje Tablice asocjacyjne VARRAY Tablice zagnieżdżone

Pakiety podprogramów Dynamiczny SQL

Język SQL. Rozdział 9. Język definiowania danych DDL, część 2.

SQL 4 Structured Query Lenguage

15. Funkcje i procedury składowane PL/SQL

Wprowadzenie do języka SQL

Język SQL. Rozdział 10. Perspektywy Stosowanie perspektyw, tworzenie perspektyw prostych i złożonych, perspektywy modyfikowalne i niemodyfikowalne.

Język SQL. Rozdział 4. Funkcje grupowe Funkcje grupowe, podział relacji na grupy, klauzule GROUP BY i HAVING.

2 PL/SQL - podstawy Zmienne i stałe Operatory SQL w PL/SQL Instrukcje sterujące... 8

Procedury składowane. Funkcje vs. procedury Funkcja. Procedura. zazwyczaj ma parametry tylko typu IN; można wywoływać z poziomu

11 marca Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska. Systemy baz danych - wykład III. dr inż.

Plan wykładu BAZY DANYCH II WYKŁAD 2. Bloki. Struktura bloku

Oracle PL/SQL. Paweł Rajba.

1 Wprowadzenie do bloków nazwanych 1. 2 Parametry 2. 3 Procedury i funkcje 3. 4 Pakiety 6. 5 Podsumowanie Źródła 10

Ćwiczenie 11 PL/SQL. Wprowadzenie do języka PL/SQL

Składowane procedury i funkcje

Wymagania: Konstrukcja prostych zapytań w języku SQL, umiejętność wykorzystania funkcji wierszowych i agregujących.

Zarządzanie bazą danych. Bazy Danych i Systemy informacyjne Wykład 4. Piotr Syga

DECLARE VARIABLE zmienna1 typ danych; BEGIN

Wprowadzenie do języka PL/SQL. Język PL/SQL Wprowadzenie. Struktura blokowa programu. Przykładowy program w PL/SQL. Zmienne rekordowe.

Optymalizacja poleceń SQL Metody dostępu do danych

Celem ćwiczenia jest wprowadzeniem do programowaniu w języku PL/SQL. Język PL/SQL umoŝliwia tworzenie programów, przetwarzających dane w bazie danych.

Pakiety są logicznymi zbiorami obiektów takich jak podprogramy, typy, zmienne, kursory, wyjątki.

Tabele wykorzystywane w przykładach

Klasyczna Analiza Danych

Systemy GIS Tworzenie zapytań w bazach danych

SQL do zaawansowanych analiz danych część 1.

Oracle PL/SQL. Paweł Rajba.

PL/SQL. Część 1 Bloki PL/SQL. Piotr Medoń

Oracle PL/SQL. Paweł Rajba.

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

KOLEKCJE - to typy masowe,zawierające pewną liczbę jednorodnych elementów

Język DML. Instrukcje DML w różnych implementacjach SQL są bardzo podobne. Podstawowymi instrukcjami DML są: SELECT INSERT UPDATE DELETE

1. Wyzwalacze BD (ang. triggers)

Obiektowe bazy danych Ćwiczenia laboratoryjne (?)

Indeksy. Indeks typu B drzewo

ORACLE (Wykład 1) aragorn.pb.bialystok.pl/~aonisko. Typy rozproszonych baz danych. Systemy klient-serwer. Klient-serwer: Przykład

Wyzwalacze TWORZENIE WYZWALACZY

Ustawienie na poziomie sesji (działa do zmiany lub zakończenia sesji zamknięcia połączenia).

Perspektywy Stosowanie perspektyw, tworzenie perspektyw prostych i złożonych, perspektywy modyfikowalne i niemodyfikowalne, perspektywy wbudowane.

Bazy Danych i Usługi Sieciowe

Transkrypt:

Język PL/SQL. Rozdział 2. Kursory Deklarowanie kursora, otwieranie kursora, pobieranie z kursora, zamykanie kursora, zmienne kursorowe, wyrażenie CURSOR, kursory niejawne. 1

Kursor jawny Każde zapytanie SQL umieszczone w programie PL/SQL może zwrócić zero, jedną bądź wiele krotek. Aby efektywnie przetworzyć krotkizwrócone przez zapytanie korzystamy z kursorów. Kursor jest obiektem związanym z zapytaniem. Programista musi: Zadeklarować kursor. Otworzyć kursor (zidentyfikować zbiór wynikowy). Pobrać daną do kursora (odczytać kolejną krotkę z wyniku zapytania i wpisać ją do kursora). Zamknąć kursor (zwolnić obszar pamięci przydzielony kursorowi). Kursor to nazwa obszaru roboczego, w którym mieści się wynik zapytania (ang. resultset). Wewnątrz kursora wyróżniamy bieżący wiersz (ang. current row). 2

Deklarowanie kursora (1) Kursor bezparametrowy: CURSOR nazwa_kursora IS zapytanie_sql; Nazwa kursora nie jest zmienną, lecz identyfikatorem. Do kursora nie można przypisać wartości. Przykład: CURSOR c_zespoly IS... SELECT nazwa, adres FROM zespoly ORDER BY nazwa; 3

Deklarowanie kursora (2) Kursor sparametryzowany CURSOR nazwa_kursora(lista_parametrów_formalnych) IS zapytanie_sql; Deklaracja parametru parametr typ_wartości [ { := DEFAULT } wartość ] Parametry są widoczne tylko wewnątrz kursora, nie można związać z nimi żadnych ograniczeń. Nie podajemy długości dla typu wartości parametru. CURSOR c_pracownicy (p_zespol NUMBER DEFAULT 10)... IS SELECT * FROM pracownicy WHERE id_zesp = p_zespol ORDER BY nazwisko; 4

Otwieranie kursora Otwarcie kursora powoduje wykonanie związanego z nim zapytania i zidentyfikowanie zbioru wynikowego, zawierającego rekordy spełniające kryteria wyszukiwania. OPEN nazwa_kursora [(lista_parametrów_aktualnych)]; CURSOR c_zespolyis SELECT nazwa, adres FROM zespoly ORDER BY nazwa; CURSOR c_pracownicy(p_zespol NUMBER DEFAULT 10) IS SELECT * FROM pracownicy WHERE id_zesp = p_zespol ORDER BY nazwisko; OPEN c_zespoly;... OPEN c_pracownicy(20);... -- Zamykamy kursor c_pracownicy OPEN c_pracownicy; -- Parametr P_ZESPOL przyjmuje wartość domyślną równą 10... 5

Pobieranie rekordów z kursora (1) FETCH nazwa_kursora INTO lista_zmiennych_prostych zmienna_rekordowa; Wykonanie polecenia FETCH powoduje odczytanie bieżącego wiersza kursora i przesunięcie znacznika kursora na kolejny wiersz. Na liście zmiennych musi się znajdować taka sama liczba zmiennych jak liczba atrybutów w kursorze. Odpowiednie zmienne i atrybuty muszą się zgadzać co do typu. CURSOR c_zespoly IS SELECT nazwa, adres FROM zespoly ORDER BY nazwa; v_nazwa zespoly.nazwa%type; v_adres zespoly.adres%type; OPEN c_zespoly; FETCH c_zespoly INTO v_nazwa, v_adres; -- użycie zmiennych prostych... 6

Pobieranie rekordów z kursora (2) CURSOR c_pracownicy(p_zespol NUMBER DEFAULT 10) IS SELECT * FROM pracownicy WHERE id_zesp = p_zespol ORDER BY nazwisko; r_pracownik pracownicy%rowtype; -- definicja w oparciu o strukturę rekordu relacji OPEN c_pracownicy(40); FETCH c_pracownicy INTO r_pracownik; -- użycie zmiennej rekordowej... CURSOR c_zespoly IS SELECT nazwa, adres FROM zespoly ORDER BY nazwa; r_c_zespoly c_zespoly%rowtype; -- definicja w oparciu o strukturę rekordu kursora OPEN c_zespoly; FETCH c_zespoly INTO r_c_zespoly; -- użycie zmiennej rekordowej... 7

Zamykanie kursora CLOSE nazwa_kursora; Zamknięcie kursora powoduje, że kursor staje się nieaktywny a zbiór wynikowy związany z kursorem staje się niezdefiniowany. Zamknięty kursor można powtórnie otworzyć, np. z innymi parametrami. Każde odwołanie się do zamkniętego (lub jeszcze nie otwartego) kursora powoduje błąd INVALID_CURSOR. CURSOR c_zespoly IS SELECT nazwa, adres FROM zespoly ORDER BY nazwa; v_nazwa zespoly.nazwa%type; v_adres zespoly.adres%type; OPEN c_zespoly; FETCH c_zespoly INTO v_nazwa, v_adres; CLOSE c_zespoly;... 8

Atrybuty kursora (1) %FOUND wartością atrybutu jest TRUEjeśli ostatnia operacja FETCH odczytała krotkę z kursora. W przeciwnym wypadku (tzn. kiedy odczyt się nie udał) atrybut przyjmuje wartość FALSE. Przed pierwszym odczytem atrybut ma wartość NULL %NOTFOUND wartością atrybutu jest FALSE jeśli ostatnia operacja FETCH odczytała krotkę z kursora. W przeciwnym wypadku (tzn. kiedy odczyt się nie udał) atrybut przyjmuje wartość TRUE. Przed pierwszym odczytem atrybut ma wartość NULL %ROWCOUNT wartością atrybutu jest liczba odczytanych z kursora krotek. Przed pierwszym odczytem atrybut ma wartość 0 %ISOPEN wartością atrybutu jest TRUEjeśli kursor jest otwarty i FALSE jeśli kursor jest zamknięty. 9

Atrybuty kursora (2) CURSOR c_zespoly IS SELECT nazwa, adres FROM zespoly ORDER BY nazwa; v_nazwa zespoly.nazwa%type; v_adres zespoly.adres%type; OPEN c_zespoly; LOOP FETCH c_zespoly INTO v_nazwa, v_adres; EXIT WHEN c_zespoly%notfound; DBMS_OUTPUT.PUT_LINE('Zespół nr ' c_zespoly%rowcount); DBMS_OUTPUT.PUT_LINE(v_nazwa ', adres: ' v_adres); END LOOP; CLOSE c_zespoly; END; 10

Pętla FOR z kursorem CURSOR c_pracownicy(p_zespol NUMBER DEFAULT 10) IS SELECT * FROM pracownicy WHERE id_zesp= p_zespolorder BY nazwisko; FOR r_prac IN c_pracownicy(20) LOOP DBMS_OUTPUT.PUT_LINE(r_prac.nazwisko ' zarabia ' r_prac.placa_pod ' i pracuje jako ' r_prac.etat); END LOOP; END; Zmienna sterująca pętlą jest deklarowana automatycznie jako zmienna typu kursor%rowtype. Kursor jest otwierany automatycznie. W każdym przebiegu pętli jedna krotka jest pobierana z kursora i umieszczana w zmiennej sterującej pętlą. Po pobraniu ostatniej krotki kursor jest automatycznie zamykany. 11

Pętla FOR z podzapytaniem FOR r_pracin (SELECT* FROM pracownicy WHERE id_zesp= 20 ORDER BY nazwisko) LOOP DBMS_OUTPUT.PUT_LINE(r_prac.nazwisko ' zarabia ' r_prac.placa_pod ' i pracuje jako ' r_prac.etat); END LOOP; END; Zmienna sterująca pętlą jest deklarowana automatycznie jako zmienna typu podzapytanie%rowtype. Podzapytanie może być parametryzowane przez użycie zmiennych w tekście zapytanie. v_id_zesp zespoly.id_zesp%type; v_id_zesp:= 30; FOR r_prac IN (SELECT* FROM pracownicy WHERE id_zesp = v_id_zesp ORDER BY nazwisko) LOOP... 12

Klauzula WHERE CURRENT OF (1) Ma zastosowanie do poleceń UPDATE i DELETE, kierowanych do zbioru rekordów kursora. Warunek jest spełniony tylko i wyłącznie dla bieżącego rekordu w kursorze. Zapytanie definiujące kursor musi zawierać klauzulę FOR UPDATE OF (założenie blokady na odczytywanych krotkach). CURSOR c_pracownicy(p_zespol NUMBER DEFAULT 10) IS SELECT * FROM pracownicy WHERE id_zesp= p_zespolorder BY nazwisko FOR UPDATE; FOR r_prac IN c_pracownicy(10) LOOP IF (r_prac.etat = 'DYREKTOR') THEN UPDATE pracownicy SET placa_pod = 1.1 * placa_pod WHERE CURRENT OF c_pracownicy; ELSE UPDATE pracownicy SET placa_pod = 0.9 * placa_pod WHERE CURRENT OF c_pracownicy; END IF; END LOOP; END; 13

Klauzula WHERE CURRENT OF (2) Jeśli zapytanie definiujące kursor używa połączenia, można w klauzuli FOR UPDATE wskazać relację, do której będą kierowane operacje DML. Relację wskazuje się przez podanie dowolnego atrybutu z relacji. CURSOR c_prac_zesp IS SELECT nazwisko, placa_pod, nazwa FROM pracownicy JOIN zespoly USING(id_zesp) FOR UPDATE OF nazwisko; FOR r_pz IN c_prac_zesp LOOP IF (r_pz.nazwa = 'ADMINISTRACJA') THEN DELETE pracownicy WHERE CURRENT OF c_prac_zesp; ELSE UPDATE pracownicy SET placa_pod = 2 * placa_pod WHERE CURRENT OF c_prac_zesp; END IF; END LOOP; END; 14

Zmienna kursorowa Jest referencją do obiektu reprezentującego kursor lub zapytanie, nie jest kursorem! Pozwala na użycie kursora udostępniającego różne zbiory rekordów. Rodzaje zmiennych kursorowych: z określoną strukturą rekordu zmienna kursorowa silnie typowana, bez określonej struktury rekordu zmienna kursorowa słabo typowana. Proces deklarowanie zmiennej kursorowej: 1. zadeklarowanie typu REF CURSOR, TYPE nazwa_typu IS REF CURSOR [RETURN definicja_rekordu]; 2. zadeklarowanie właściwej zmiennej za pomocą typu z p. 1. nazwa_zmiennej_kursorowej nazwa_typu; 15

Zmienna kursorowa silnie typowana TYPE tpracownik IS REF CURSOR RETURN pracownicy%rowtype; END; v_zmienna_kur tpracownik; r_pracownik pracownicy%rowtype; OPEN v_zmienna_kur FOR SELECT * FROM pracownicy LOOP WHERE etat = 'PROFESOR'; FETCH v_zmienna_kur INTO r_pracownik; EXIT WHEN v_zmienna_kur %NOTFOUND; DBMS_OUTPUT.PUT_LINE (r_pracownik.nazwisko); END LOOP; CLOSE v_zmienna_kur; OPEN v_zmienna_kur FOR SELECT * FROM pracownicy LOOP WHERE etat = 'ADIUNKT'; V END LOOP; CLOSE v_zmienna_kur; 16

Zmienna kursorowa słabo typowana TYPE tkursor IS REF CURSOR; END; v_zmienna_kur tkursor; r_pracownik pracownicy%rowtype; r_zespol zespoly%rowtype; OPEN v_zmienna_kur FOR SELECT * FROM pracownicy; LOOP FETCH v_zmienna_kur INTO r_pracownik; EXIT WHEN v_zmienna_kur %NOTFOUND; DBMS_OUTPUT.PUT_LINE (r_pracownik.nazwisko); END LOOP; CLOSE v_zmienna_kur; OPEN v_zmienna_kur FOR SELECT * FROM zespoly; LOOP FETCH v_zmienna_kur INTO r_zespol; EXIT WHEN v_zmienna_kur %NOTFOUND; DBMS_OUTPUT.PUT_LINE (r_zespol.nazwa); END LOOP; CLOSE v_zmienna_kur; 17

Wyrażenie CURSOR Pozwala na zdefiniowane kursora zagnieżdżonego w zapytaniu. Używane zarówno w poleceniach SQL jak i programach PL/SQL. Składnia: SELECT V, CURSOR(zapytanie) FROM V Zasady stosowania: tylko dla kursorów jawnych, kursor obsługujący zagnieżdżone zapytanie jest otwierany i zamykany automatycznie, dopuszczalne wielopoziomowe zagnieżdżanie wyrażenia. 18

Wyrażenie CURSOR w poleceniu SQL SQL> SELECT nazwa, CURSOR(SELECT nazwisko, placa_pod FROM pracownicy p WHERE id_zesp = z.id_zesp ORDER BY nazwisko) AS pracownik FROM zespoly z ORDER BY nazwa; NAZWA PRACOWNIK -------------------- -------------------- ADMINISTRACJA CURSOR STATEMENT : 2 CURSOR STATEMENT : 2 NAZWISKO PLACA_POD --------------- ---------- MAREK 410,2 WEGLARZ 1730 ALGORYTMY CURSOR STATEMENT : 2 CURSOR STATEMENT : 2 NAZWISKO PLACA_POD --------------- ---------- BLAZEWICZ 1350 BADANIA OPERACYJNE CURSOR STATEMENT : 2 CURSOR STATEMENT : 2 nie wybrano żadnych wierszy... 19

Wyrażenie CURSOR w PL/SQL TYPE tkursor IS REF CURSOR; CURSOR cwszystko IS SELECT nazwa, CURSOR(SELECT nazwisko FROM pracownicy p WHERE id_zesp = z.id_zesp ORDER BY nazwisko) AS pracownik FROM zespoly z ORDER BY nazwa; v_pracownicy tkursor; v_nazwa zespoly.nazwa%type; v_nazwisko pracownicy.nazwisko%type; OPEN cwszystko; LOOP FETCH cwszystko INTO v_nazwa, v_pracownicy; EXIT WHEN cwszystko %NOTFOUND; DBMS_OUTPUT.PUT_LINE ('Zespół: ' v_nazwa); LOOP --brak OPEN FETCH v_pracownicy INTO v_nazwisko; EXIT WHEN v_pracownicy%notfound; DBMS_OUTPUT.PUT_LINE(v_pracownicy%ROWCOUNT ' ' v_nazwisko); END LOOP; -- brak CLOSE END LOOP; CLOSE cwszystko; END; 20

Kursor niejawny (1) Każde polecenie DML (INSERT, UPDATE, DELETE, SELECT FOR UPDATE) powoduje utworzenie kursora niejawnego (ang. implicit cursor). Atrybuty kursora niejawnego pozwalają na sprawdzenie statusu ostatnio wykonanegopolecenia DML: SQL%ROWCOUNT: liczba wierszy zmodyfikowanych przez polecenie SQL%FOUND: TRUEjeśli ostatnie polecenie zmodyfikowało jakiekolwiek wiersze SQL%NOTFOUND: TRUEjeśli ostatnie polecenie nie zmodyfikowało żadnych wierszy SQL%ISOPEN: zawsze FALSE (kursor niejawny jest zamykany natychmiast po zakończeniu polecenia) 21

Kursor niejawny (2) INSERT INTO zespoly SELECT seq_zesp.nextval, nazwa ' (NOWY)', adres FROM zespoly; if SQL%FOUND then DBMS_OUTPUT.PUT_LINE ('Liczba nowych rekordów: ' SQL%ROWCOUNT); else DBMS_OUTPUT.PUT_LINE ('Nie wstawiono żadnego rekordu!'); end if; DELETE pracownicy WHERE id_zesp in (SELECT id_zesp from zespoly WHERE nazwa = 'TESTOWY'); DBMS_OUTPUT.PUT_LINE('Liczba usuniętych rekordów: ' SQL%ROWCOUNT); END; 22