^fZS 7. SYSTEMOWE ASPEKTY JĘZYKA SOL
Teraz z kolei zajmijmy się takim przypadkiem, gdy pewna funkcja korzysta z kursora gwiazdaKursor, zdefiniowanego w przykładzie 7.6, a jednocześnie inne funkcje (albo nawet ta sama funkcja) modyfikują którąś z relacji: Film lub GwiazdyW. W podrozdziale 7.2 przedstawimy bardziej wyczerpująco problematykę równoległego dostępu do zasobów. Teraz, jednak skupimy uwagę na przypadku, w którym inne procesy usiłują modyfikować relację używaną przez nasz program.
Co wówczas zrobić? Być może nic. Może się zdarzyć bowiem, że chcemy tylko śledzić dane dotyczące filmów lub gwiazd filmowych i fakt, że jakaś krotka została właśnie wstawiona albo usunięta nic ma większego znaczenia. Jeśli tak, to po prostu przeglądamy dane dostępne za pośrednictwem kursora.
Jednakże może się zdarzyć i tak, że nie chcemy, aby przeglądane krotki ulegały modyfikacjom. Na przykład, jeśli wartości przeglądane przez kursor mają przesądzić o wstawieniu (lub nie) nowej krotki do relacji GwiazdyW, to przetwarzanie może się zapętlić, gdy nowa krotka wygeneruje nowe krotki wstawiane za pośrednictwem kursora, który z kolei wygeneruje kolejne krotki itd. Jeśli istnieje ryzyko tego typu lub ryzyko wystąpienia innych niepożądanych zachowań, to można określić kursor jako niewrażliwy na równoczesne modyfikacje.
PRZYKŁAD 7.7
Wiersz 1) z rys. 7.6 zostaje zmieniony w następujący sposób:
i) EXEC SQL DECLARE gwiazdaFilmowaKursor INSENSI7IVE
CURSOR FOR
W takim przypadku system SQL zagwarantuje, że modyfikacje relacji Fi m oraz GwiazdyW, przetwarzane między otwarciem a zamknięciem kursora gwiazdaFiImowaKursor nie będą wprowadzane do zakresu dostępnego przez ten kursor.
□
Korzystanie z kursora niewrażliwego może się okazać kosztowne, ponieważ system SQL może potrzebować wiele czasu na zorganizowanie właściwego dostępu do danych. Szczegółowe omów ienie tego zagadnienia nastąpi w podrozdziale 7.2. Teraz napomkniemy jedynie, że można zwyczajnie na czas czytania relacji Film oraz GwiazdyW przez kursor niewrażliwy zabronić innym procesom dostępu do zawartych w nich danych.
O niektórych kursorach wiadomo na pewno, że nie powodują modyfikacji w relacji R stanowiącej ich zakres. Takie kursory mogą działać jednocześnie z kursorem niewrażliwym dla R, bez napotkania ryzyka niekorzystnych
dla kursora niewrażliwego zmian R. Takie kursory można zdefiniować j; FOR READ ONLY i w ten sposób jawnie powiadomić system bazy danych, dostęp za pośrednictwem tych kursorów nie spowoduje zmian w danych.
PRZYKŁAD 7.8
Po wierszu 5) na rys. 7.6 można dopisać następującą frazę:
6) FOR READ ONLY;
Wówczas każda próba wykonania instrukcji DELETE lub uPDATĘ za pośi nictwem kursora gwiozdaFilmowaKursor skończy się sygnalizacją błędi
Ostatnia opcja dotycząca kursora umożliwia określenie kolejności kre dostępnych przez kursor. Standardowy porządek, który obowiązuje naj< ściej, określa rozpoczęcie procesu przeglądania krotek od początku rek a ostatnią wczytywaną krotką jest ostatnia krotka relacji. Jednakże mo zmienić ten naturalny porządek i wczytywać wielokrotnie te same krotk pośrednictwem kursora otwartego tylko jeden raz. Korzystanie z tej o wymaga wykonania dwóch czynności.
1. W deklaracji kursora należ)' umieścić słowo kluczowe SCROLL bei średnio przed słowem kluczowym CURSOR. Powoduje to, że sys
' $QL „wie”, że krotki będą wczytywane w innej kolejności niż wyj to z porządku zapisania ich w relacji.
2. W instrukcji FETCH po słowie kluczowym FETCH należ)- umie określenie miejsca następnej krotki. Należ)- wybrać jedną z następ eych możliwości:
a) Aby pobrać krotkę następną po bieżącej lub poprzednią, na wpisać odpowiednio NEXT lub PRIOR. Są one liczone wzglę bieżącej pozycji kursora. Jeśli nie poda się nic, to standardowo stanie wybrana następna krotka (NEXT jest domyślne).
b) FIRST lub LAST określa wybór odpowiednio pierwszej lub o niej krotki z relacji.
c) reLATIVE. a potem liczba całkowita, dodatnia lub ujemna, ł> określa, ile krotek wprzód albo odpowiednio wstecz należ)- p< nać, aby pobrać nową krotkę. Na przykład R£LA7TVE : jest i noważne next, a RELATIVE -1 jest równoważne prior.
d) AJSS0LU7F., a potem liczba całkowita, która wskazuje pozycję 1 ki, licząc od pierwszej Gęśli wartość jest dodatnia) lub od osta wstecz (jeśli liczba jest ujemna). Na przykład ABSOLUTE 1 równoważne FIRST, a A3S0LUTF. -i jest równoważne LAST.