Pewnie już nieaktualne, ale co tam:
CREATE OR REPLACE TRIGGER instruktor_kursantem
AFTER INSERT
ON Kurs
FOR EACH ROW
DECLARE
w_id_instruktora NUMBER;
BEGIN
SELECT :new.id_instruktora INTO w_id_instruktora
FROM Kurs;
INSERT INTO KursantNOWY(imie, nazwisko) values
(SELECT imie, nazwisko FROM Instruktor
WHERE id_instruktora= w_id_instruktora);
END;
/
Oprócz poprawek w insercie o których pisał yarel pozbyłbym się także select'a
Select ten
- po pierwsze nic nie daje.
- Po drugie jest błedny.
- Po trzecie odwołuje się do tabeli kurs w wyzwalaczu opartym na tabeli kurs co wywoła mutacje.
ad 1) nie ma potrzeby wyszukiwać ID instruktora. ID jest znane i znajduje się w :new.id_instruktora
Nic więcej nam nie trzeba!!
ad 2)
SELECT :new.id_instruktora
INTO w_id_instruktora
FROM Kurs
Można wykonać ten select tylko wtedy, gdy w tablicy kursy znajduje się dokładnie 1 kurs. W przeciwnym razie pojawi się błąd: ORA-01403: no data found lub ORA-01422 To many rows.
SELECT INTO musi być zawsze z warunkiem WHERE takim, że zwróci dokładnie 1 wiersz!!!
ad 3) W wyzwalaczu na tabeli XYZ nie można odwoływać się do tabeli XYZ. W takim przypadku Oracle wyrzuca jakiś brzydki błąd ora...
Z innych rzeczy - brakuje wprowadzenie ID do tablicy kursantów, oraz powiązania kursantów z kursem.
Poniżej trochę lepszy kod - zakładam istnienie sekwencji: kursant_seq.
CREATE OR REPLACE TRIGGER instruktor_kursantem
AFTER INSERT
ON Kurs
FOR EACH ROW
DECLARE
BEGIN
INSERT INTO Kursant(id, imie, nazwisko)
SELECT kursant_seq.nextval, imie, nazwisko FROM Instruktor
WHERE id_instruktora= :new.id_instruktora ;
END;