Untitled
unknown
plain_text
10 months ago
8.3 kB
3
Indexable
-- Utwórz w procedurę zwracająca dane studentów (Imię, Nazwisko, Miasto, Numer
-- indeksu), których rok rekrutacji będzie podawany w parametrze procedury
CREATE OR REPLACE PROCEDURE Students (p_Rok INT)
IS
CURSOR StudentZroku IS
SELECT Imie, Nazwisko, NrIndeksu
FROM Osoba O
JOIN Student S ON O.IdOsoba = S.IdOsoba
WHERE EXTRACT(YEAR FROM DataRekrutacji) = p_Rok;
v_Student StudentZroku%ROWTYPE;
BEGIN
OPEN StudentZroku;
LOOP
FETCH StudentZroku INTO v_Student;
EXIT WHEN StudentZroku%NOTFOUND;
dbms_output.put_line(v_Student.Imie || ' ' || v_Student.Nazwisko);
END LOOP;
CLOSE StudentZroku;
END;
Set Serveroutput on;
BEGIN
Students(2013);
end;
-- Utwórz procedurę, która będzie „przenosiła” zapisane w bazie danych osoby z miasta,
-- którego nazwa jest podana w parametrze procedury do innego miasta, też podanego
-- (nazwa) w parametrze procedury. W wyniku działania procedury proszę też wyświetlić
-- komunikat z informacją, ile osób zostało przeniesionych i pomiędzy jakimi miastami.
CREATE TABLE Miasto (
IdMiasto INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
Miasto VARCHAR2(32) NOT NULL
);
-- Dodanie kilku miast
INSERT INTO Miasto (Miasto) VALUES ('Warszawa');
INSERT INTO Miasto (Miasto) VALUES ('Kraków');
INSERT INTO Miasto (Miasto) VALUES ('Poznań');
INSERT INTO Miasto (Miasto) VALUES ('Łódź');
ALTER TABLE Osoba ADD IdMiasto INT;
ALTER TABLE Osoba
ADD CONSTRAINT fk_Miasto FOREIGN KEY (IdMiasto) REFERENCES Miasto(IdMiasto);
CREATE OR REPLACE PROCEDURE TRANSFER_PEOPLE (
v_zMiasta IN VARCHAR2,
v_doMiasta IN VARCHAR2
)
IS
-- Deklaracja zmiennych
v_z NUMBER;
v_do NUMBER;
v_counter NUMBER := 0; -- Inicjalizacja licznika na zero
-- Kursor po osobach z określonego miasta
CURSOR c_iterator IS
SELECT IdOsoba FROM Osoba WHERE IdMiasto = v_z;
BEGIN
-- Pobranie ID miasta źródłowego
SELECT IdMiasto
INTO v_z
FROM Miasto
WHERE Miasto = v_zMiasta;
-- Pobranie ID miasta docelowego
SELECT IdMiasto
INTO v_do
FROM Miasto
WHERE Miasto = v_doMiasta;
-- Sprawdzenie, czy miasto źródłowe i docelowe są różne
IF v_z = v_do THEN
DBMS_OUTPUT.PUT_LINE('Miasto źródłowe i docelowe są identyczne. Brak potrzeby transferu.');
RETURN;
END IF;
-- Iteracja po osobach z danego miasta i aktualizacja
FOR osoba_rec IN c_iterator LOOP
UPDATE Osoba
SET IdMiasto = v_do
WHERE IdOsoba = osoba_rec.IdOsoba;
-- Zwiększenie licznika tylko jeśli zmieniono rekord
IF SQL%ROWCOUNT > 0 THEN
v_counter := v_counter + 1;
END IF;
END LOOP;
-- Komunikat końcowy
DBMS_OUTPUT.PUT_LINE(v_counter || ' osoby zostały przeniesione z ' || v_zMiasta || ' do ' || v_doMiasta);
-- Zatwierdzenie transakcji
COMMIT;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Jedno z miast nie istnieje!');
ROLLBACK;
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Wystąpił nieoczekiwany błąd: ' || SQLERRM);
ROLLBACK;
END;
/
BEGIN
TRANSFER_PEOPLE('Warszawa', 'Kraków');
END;
/
-- Utwórz procedurę służącą do dopisywania nowego przedmiotu do bazy. Procedura będzie
-- otrzymywała w parametrach nazwę i symbol przedmiotu. W procedurze należy sprawdzić,
-- czy przedmiot o danej nazwie lub symbolu istnieje. Jeżeli nie, należy go dopisać. Na
-- zakończenie należy wypisać komunikat z informacją o wykonaniu (lub nie) operacji.
CREATE OR REPLACE PROCEDURE ADD_SUBJECT(
NAZWA IN VARCHAR2,
SYMBOL IN VARCHAR2
)
IS
found NUMBER := 0; -- 0 = false, 1 = true
max_current_id NUMBER;
BEGIN
-- Sprawdzenie czy przedmiot już istnieje
SELECT COUNT(*)
INTO found
FROM PRZEDMIOT
WHERE PRZEDMIOT = NAZWA OR SYMBOL = SYMBOL;
-- Jeśli znaleziono przedmiot
IF found > 0 THEN
DBMS_OUTPUT.PUT_LINE('Przedmiot ' || NAZWA || ' już istnieje w bazie danych.');
ELSE
-- Znalezienie najwyższego ID przedmiotu
SELECT NVL(MAX(IDPRZEDMIOT), 0)
INTO max_current_id
FROM PRZEDMIOT;
-- Dodanie nowego przedmiotu
INSERT INTO PRZEDMIOT(IDPRZEDMIOT, PRZEDMIOT, SYMBOL)
VALUES(max_current_id + 1, NAZWA, SYMBOL);
DBMS_OUTPUT.PUT_LINE('Dodano przedmiot ' || NAZWA || ' do bazy danych.');
COMMIT;
END IF;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Wystąpił błąd: ' || SQLERRM);
ROLLBACK;
END;
/
-- Utwórz procedurę dopisującą nowego dydaktyka do bazy. Imię, nazwisko, płeć i nazwa
-- stopnia naukowego będą podawane w parametrach procedury.
--
-- W procedurze sprawdź istnienie w bazie stopnia naukowego o podanej w parametrze nazwie, oraz rekordu
-- zawierającego dane kandydata (imię, nazwisko, stopień).
--
-- Jeżeli taki dydaktyk już jest w bazie odnotowany, nie dopisuj go.
-- Jeżeli stopień o podanej nazwie nie jest w bazie
-- odnotowany, wstaw NULL w rekordzie dydaktyka.
-- Nowo dopisanego dydaktyka zrób podwładnym profesora Cezarego Czosnka.
--
-- Procedurę należy zakończyć komunikatem informującym o wykonanej operacji.
-- W PL/SQL utwórz i wykorzystaj sekwencję do realizacji wartości klucza głównego w tabelach OSOBA i DYDAKTYK.
CREATE SEQUENCE przedmiot_seq
START WITH 1 -- Pierwsza wartość wygenerowana przez sekwencję
INCREMENT BY 1 -- Każda kolejna wartość będzie zwiększana o 1
NOCACHE -- Nie buforuje wartości (można pominąć)
NOCYCLE; -- Nie powtarza wartości po osiągnięciu maksimum
CREATE OR REPLACE PROCEDURE ADD_TEACHER(
IMIE IN VARCHAR2,
NAZWISKO IN VARCHAR2,
PLEC IN CHAR,
STOPIEN_NAZWA IN VARCHAR2
)
IS
-- Zmienna do przechowywania ID osoby
id_osoba NUMBER;
przelozony NUMBER;
stopien_exists NUMBER;
id_katedra NUMBER;
found_teacher NUMBER := 0;
BEGIN
-- Sprawdzenie, czy dana osoba już istnieje w bazie
SELECT COUNT(*)
INTO found_teacher
FROM OSOBA O
JOIN DYDAKTYK D ON O.IDOSOBA = D.IDOSOBA
WHERE O.IMIE = IMIE AND O.NAZWISKO = NAZWISKO;
-- Jeśli dydaktyk już istnieje, zakończ procedurę
IF found_teacher > 0 THEN
DBMS_OUTPUT.PUT_LINE('Dydaktyk o podanym imieniu i nazwisku już istnieje w bazie.');
RETURN;
END IF;
-- Pobranie ID stopnia naukowego, jeśli istnieje
BEGIN
SELECT IDSTOPIEN
INTO stopien_exists
FROM STOPNIETYTULY
WHERE STOPIEN = STOPIEN_NAZWA;
EXCEPTION
WHEN NO_DATA_FOUND THEN
stopien_exists := NULL;
END;
-- Pobranie ID przełożonego (profesor Cezary Czosnek)
BEGIN
SELECT IDOSOBA
INTO przelozony
FROM OSOBA
WHERE IMIE = 'Cezary' AND NAZWISKO = 'Czosnek';
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Przełożony nie został znaleziony.');
RETURN;
END;
-- Poprawione pobieranie ID katedry z jednoznacznymi aliasami
BEGIN
SELECT K.IDKATEDRA
INTO id_katedra
FROM KATEDRA K
JOIN DYDAKTYK D ON K.IDKATEDRA = D.IDKATEDRA
WHERE D.IDOSOBA = przelozony;
EXCEPTION
WHEN NO_DATA_FOUND THEN
id_katedra := NULL;
END;
-- Dodanie nowego rekordu w tabeli OSOBA
INSERT INTO OSOBA (IDOSOBA, IMIE, NAZWISKO, PLEC)
VALUES (przedmiot_seq.NEXTVAL, IMIE, NAZWISKO, PLEC);
-- Przypisanie osoby do tabeli DYDAKTYK
INSERT INTO DYDAKTYK (IDOSOBA, IDSTOPIEN, PODLEGA, IDKATEDRA)
VALUES (przedmiot_seq.CURRVAL, stopien_exists, przelozony, id_katedra);
DBMS_OUTPUT.PUT_LINE('Dydaktyk ' || IMIE || ' ' || NAZWISKO || ' został dodany.');
COMMIT;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Wystąpił błąd: ' || SQLERRM);
ROLLBACK;
END;
/
Editor is loading...
Leave a Comment