Witam po raz kolejny :)
Czy jest możliwość szybkiej zmiany działającej funkcji na działającą w podobny sposób procedurę?
Zamiast zwracania wartości byłyby one po prostu wypisywane w DBMS OUTPUT
Korzystam tutaj dodatkowo z kursora i Package
--Funkcja zwracający propozycje filmów nie oglądanych przez danego klienta (X)
--SELECT * FROM TABLE(F_PREFERENCJE(x));
CREATE OR REPLACE FUNCTION F_PREFERENCJE(X INTEGER)
RETURN OPAKOWANIE.TABLICA PIPELINED IS CURSOR kk IS
SELECT F.ID_F, F.NAZWA
FROM FILM F, KLIENT K, PREFERENCJE PRE, GATUNEK G
WHERE F.ID_F NOT IN
(
SELECT DISTINCT F.ID_F
FROM KLIENT K, ZAMOWIENIE Z, POZYCJA P, EGZEMPLARZ_FILMU EF, FILM F, GATUNEK G, PREFERENCJE PRE
WHERE K.ID_K = X AND Z.ID_K = K.ID_K AND P.ID_Z = Z.ID_Z AND P.ID_EF = EF.ID_EF AND EF.ID_F = F.ID_F AND F.ID_G = G.ID_G
)
AND K.ID_P = PRE.ID_P AND PRE.ID_G = G.ID_G AND F.ID_G = G.ID_G AND K.ID_K = X
ORDER BY F.ID_F ASC;
w OPAKOWANIE.WIERSZ;
BEGIN
OPEN kk; --otwarcie kursora
LOOP
FETCH kk into w; --zapisywanie kolejnych wierszów do tablicy
EXIT WHEN kk%notfound;
PIPE ROW(w); --zwracanie pojedynczego wiersza
END LOOP;
CLOSE kk;
RETURN;
END;
CREATE OR REPLACE PACKAGE OPAKOWANIE IS --paczka sluży do przechowywania wierszy z funkcji preferencji
TYPE WIERSZ IS RECORD
(
ID_FILMU NUMBER,
NAZWA VARCHAR2(100)
);
TYPE TABLICA IS TABLE OF WIERSZ;
END;