PL/SQL potrzebuję pomocy

0

Witam serdecznie

Jestem tu nowa i zalogowałam się, bo potrzebuję pomocy. Mam do zrobienia projekt z Baz Danych na zaliczenie i mam problem ze zrobieniem jednego wyzwalacza. Dane są tabele Instruktor(id, imie, nazwisko, pensja, adres, telefon), Kursant(id, imię, nazwisko, adres, telefon) i Kurs (id, taniec, cena, instruktor). W tabeli Kurs w kolumnie instruktor wpisywane jest id_instruktora z tabeli Instruktor. Mam za zadanie zrobienie wyzwalacza, który przy dodawaniu nowego kursu i wpisywaniu do niego id_instruktora wstawi jego dane do tabeli Kursant(imię i nazwisko). Czy jest ktoś w stanie mi pomóc? Z góry bardzo dziekuje. Pozdrawiam, K.

0

A jaki dokładnie masz problem? Pokaż ten trigger ktory napisałaś i spróbujemy go wspólnie poprawić.

0

Zrobiłam cos takiego, ale to była praca z internetem gdyż nie jestem dobra w kwestii oracla

SET SERVEROUTPUT ON
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;
/

0

Wygląda nieźle ale co to jest "KursantNOWY"? Przecież chcesz zrobić insert do tabeli Kursant...

0

kursantNOWY to tabela kursant tylko pod inna nazwą, żeby nie popsuć reszty projektu kombinacjami.

0

No i co mówi Oracle jak chcesz mu ten trigger zaaplikować?

0

Error(9,1): PL/SQL: SQL Statement ignored
Error(10,2): PL/SQL: ORA-00936: brak wyrażenia

0
klodi napisał(a):

Error(9,1): PL/SQL: SQL Statement ignored
Error(10,2): PL/SQL: ORA-00936: brak wyrażenia

Problemem jest składnia:

INSERT INTO KursantNOWY(imie, nazwisko) values
(SELECT imie, nazwisko FROM Instruktor
WHERE id_instruktora= w_id_instruktora);

Zamień na:

INSERT INTO KursantNOWY(imie, nazwisko)
SELECT imie, nazwisko FROM Instruktor
WHERE id_instruktora= w_id_instruktora;
0

Pewnie już nieaktualne, ale co tam:

klodi napisał(a):

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

  1. po pierwsze nic nie daje.
  2. Po drugie jest błedny.
  3. 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;

1 użytkowników online, w tym zalogowanych: 0, gości: 1