PL / SQL – Kursory
W tym rozdziale omówimy kursory w PL / SQL. Oracle tworzy obszar pamięci, zwany obszarem kontekstu, do przetwarzania instrukcji SQL, który zawiera wszystkie informacje potrzebne do przetwarzania instrukcji; na przykład liczba przetworzonych wierszy itp.
Kursor jest wskaźnikiem do tego obszaru kontekstu. PL / SQL kontroluje obszar kontekstu za pomocą kursora. Kursor przechowuje wiersze (jeden lub więcej) zwróconych przez instrukcję SQL. Zbiór wierszy, które przechowuje kursor, nazywany jest zestawem aktywnym.
Kursor można nazwać tak, aby można było się do niego odwoływać w programie do pobierania i przetwarzania wierszy zwracanych przez instrukcję SQL, jeden na czas. Istnieją dwa typy kursorów –
- Niejawne kursory
- Jawne kursory
Niejawne kursory
Niejawne kursory są automatycznie tworzone przez Oracle za każdym razem, gdy wykonywana jest instrukcja SQL, gdy nie ma dla niej wyraźnego kursora. Programiści nie mogą kontrolować niejawnych kursorów i zawartych w nich informacji.
Za każdym razem, gdy jest wydawana instrukcja DML (INSERT, UPDATE i DELETE), jest z nią powiązany niejawny kursor. W przypadku operacji INSERT kursor przechowuje dane, które mają zostać wstawione. W przypadku operacji UPDATE i DELETE kursor identyfikuje wiersze, których to dotyczy.
W języku PL / SQL można odwołać się do ostatniego niejawnego kursora jako kursora SQL, który zawsze ma atrybuty, takie jak% FOUND ,% ISOPEN,% NOTFOUND i% ROWCOUNT. Kursor SQL ma dodatkowe atrybuty,% BULK_ROWCOUNT i% BULK_EXCEPTIONS, przeznaczone do użycia z instrukcją FORALL. Poniższa tabela zawiera opis najczęściej używanych atrybutów –
S.No | Atrybut & Opis |
---|---|
1 |
% FOUND Zwraca wartość TRUE, jeśli instrukcja INSERT, UPDATE lub DELETE wpłynęła na jeden lub więcej wierszy lub instrukcja SELECT INTO zwróciła jeden lub więcej wierszy. W przeciwnym razie zwraca FALSE. |
2 |
% NOTFOUND Logiczne przeciwieństwo% FOUND. Zwraca wartość TRUE, jeśli instrukcja INSERT, UPDATE lub DELETE nie wpłynęła na żadne wiersze lub instrukcja SELECT INTO nie zwróciła żadnych wierszy. W przeciwnym razie zwraca FALSE. |
3 |
% ISOPEN Zawsze zwraca FALSE dla niejawnych kursorów, ponieważ Oracle automatycznie zamyka kursor SQL po wykonaniu powiązanej z nim instrukcji SQL. |
4 |
% ROWCOUNT Zwraca liczbę wierszy objętych instrukcją INSERT, UPDATE lub DELETE lub zwróconych przez instrukcję SELECT INTO. |
Każdy atrybut kursora SQL będzie dostępny jako sql% nazwa_atrybutu, jak pokazano poniżej w przykładzie.
Przykład
Będziemy korzystać z tabeli CUSTOMERS, którą stworzyliśmy i używaliśmy w poprzednich rozdziałach.
Poniższy program zaktualizuje tabelę i zwiększy pensję każdego klienta o 500 oraz użyje SQL% Atrybut ROWCOUNT określający liczbę wierszy, na które ma to wpływ –
Kiedy powyższy kod jest wykonywany po znaku zachęty SQL, daje następujący wynik –
6 customers selected PL/SQL procedure successfully completed.
Jeśli sprawdzisz rekordy w tabeli klientów, zobaczysz, że wiersze zostały zaktualizowane –
Jawne kursory
Jawne kursory to kursory zdefiniowane przez programistę w celu uzyskania większej kontroli nad obszar kontekstu. W sekcji deklaracji bloku PL / SQL należy zdefiniować wyraźny kursor. Jest tworzony w instrukcji SELECT, która zwraca więcej niż jeden wiersz.
Składnia do tworzenia jawnego kursora to –
CURSOR cursor_name IS select_statement;
Praca z wyraźnym kursorem obejmuje następujące kroki –
- Deklarowanie kursora do inicjalizacji pamięci
- Otwieranie kursora w celu przydzielenia pamięci
- Pobieranie kursora do pobierania danych
- Zamknięcie kursora w celu zwolnienia przydzielonej pamięci
Deklaracja kursora
Zadeklarowanie kursora definiuje kursor z nazwą i powiązana instrukcja SELECT. Na przykład –
CURSOR c_customers IS SELECT id, name, address FROM customers;
Otwarcie kursora
Otwarcie kursora alokuje pamięć dla kursora i przygotowuje go do pobrania zwróconych wierszy przez instrukcję SQL do niego. Na przykład otworzymy powyższy kursor w następujący sposób –
OPEN c_customers;
Pobieranie kursora
Pobieranie kursora obejmuje dostęp do jednego wiersza w czas. Na przykład pobierzemy wiersze z otwartego powyżej kursora w następujący sposób –
FETCH c_customers INTO c_id, c_name, c_addr;
Zamknięcie kursora
Zamknięcie kursora oznacza zwolnienie przydzielonej pamięci.Na przykład zamkniemy powyższy kursor w następujący sposób –
CLOSE c_customers;
Przykład
Poniżej znajduje się kompletny przykład ilustrujący koncepcje jawnych kursorów & minua;
Gdy powyższy kod jest wykonywany po znaku zachęty SQL, daje następujący wynik –
1 Ramesh Ahmedabad 2 Khilan Delhi 3 kaushik Kota 4 Chaitali Mumbai 5 Hardik Bhopal 6 Komal MP PL/SQL procedure successfully completed.