ZSBD-2st-1.2-lab8.tresc-1.3-Slajd34
Konstrukcja CAST(MULTISET(...
Operator TABLE omawiany poprzednio służy do zamiany kolekcji na tabelę, którą można następnie przetwarzać za pomocą poleceń DML. Istnieje również konstrukcja o działaniu odwrotnym. Jest to konstrukcja „CAST(MULTISET(...”. Pozwala ona na zamianę wyniku zapytania w kolekcję. Rozważmy przykład przedstawiony na slajdzie. Polecenie (1) tworzy typ NAZWISKA, który reprezentuje zagnieżdżoną tabelę przechowującą łańcuchy. Typ ten jest potrzebny w zapytaniu (2). Zapytanie (2) odczytuje wszystkie etaty zapisane w tabeli ETATY i zwraca NAZWY tych etatów, oraz wartość zwracaną przez wyrażenie:
CAST(MULTISET(
SELECT NAZWISKO FROM PRACOWNICY
WHERE ETAT=NAZWA) AS NAZWISKA)
Struktura tego wyrażenia jest następująca:
CAST(MULTISET( podzapytanie ) AS typ_kolekcji)
gdzie podzapytaniem jest:
SELECT NAZWISKO FROM PRACOWNICY WHERE ETAT=NAZWA,
a typem kolekcji jest typ NAZWISKA.
Podzapytanie zagnieżdżone w konstrukcji „CAST(MULTISET(...” to podzapytanie skorelowane, które zwraca zbiór nazwisk pracowników pracujących na etacie, który jest aktualnie analizowany przez zapytanie zewnętrzne. W wyniku działania konstrukcji „CAST(MULTISET(...”, wynik podzapytania jest konwertowany na kolekcję, której typ podano w wyrażeniu. Można zatem powiedzieć, że zapytanie (2) zwraca dla każdego etatu kolekcję nazwisk pracowników pracujących na tym etacie.
Konstrukcji „CAST(MULTISET(...„ można używać nie tylko w zapytaniach, ale również w innych miejscach. Jest to możliwe wszędzie tam, gdzie konieczne jest podanie wyrażenia, które zwraca całą kolekcję, np. w poleceniu INSERT, przy wstawianiu nowego obiektu zawierającego kolekcję do tabeli obiektowej.