2017-05-28 3 views
0

Ich versuche, einen Trigger für meine Datenbank zu erstellen und ich bekomme einen Fehler und ich vermute, dass es wegen meiner in-Klausel ist, aber ich bekomme den Grund nicht. Ich las in der Dokumentation davon (https://docs.oracle.com/cd/B19306_01/appdev.102/b14261/selectinto_statement.htm), und es sagt:Oracle - Fehler in Zeile 4: PL/SQL: SQL-Anweisung

standardmäßig eine SELECT INTO-Anweisung nur eine Zeile zurückgeben muss. Andernfalls löst PL/SQL die vordefinierte Ausnahme TOO_MANY_ROWS und die Werte der Variablen in der INTO-Klausel sind nicht definiert. Stellen Sie sicher, dass Ihr WHERE-Klausel spezifisch genug ist, um nur

Nun ja, eine Zeile zu passen, zumindest versuche ich sicher zu sein, dass mein where-Klausel einen zurückkehrt und nur eine Zeile. Können Sie mir einen Rat geben?

CREATE OR REPLACE TRIGGER t_ticket 
INSTEAD OF INSERT ON V_buyTicket FOR EACH ROW 
    declare ticketID number; busy number; seatRoom number; 
BEGIN 

    select count(a.id_ticket) into busy , s.freeSeats into seatRoom 
    from assigned a 
    inner join show e on (a.id_movie= e.id_movie) 
    inner join rooms s on (e.id_room = s.id_room) 
    where a.id_session = 1 AND a.id_movie = 1 
    group by s.freeSeats; 

    if(busy < seatRoom) then 
     ticketID := seq_ticket.NEXTVAL; 
     insert into tickets(id_ticket, type, number, cc, store) values(ticketID, :new.type, :new.number, :new.cc, :new.store); 
     insert into assigned (id_ticket, id_movie, id_session) values(ticketID, :new.id_movie, :new.id_session); 
    else 
     DBMS_OUTPUT.PUT_LINE('No available seats'); 
    end if; 
END; 

Antwort

0

Sie group by nicht verwenden, wenn Sie genau eine Zeile zurückgegeben werden soll:

select count(a.id_ticket), sum(s.freeSeats) 
into busy, seatRoom 
from assigned a inner join 
    show e 
    on a.id_movie = e.id_movie inner join 
    rooms s 
    on e.id_room = s.id_room 
where a.id_session = 1 and a.id_movie = 1; 

Eine Aggregation Abfrage ohne group by immer genau eine Zeile zurückgibt. Die Alternative wäre, eine explizite rownum = 1 in die WHERE Klausel aufzunehmen.

Meine Vermutung ist, dass Sie Bedingungen nicht genau ein Zimmer wählen. Vielleicht möchten Sie die Logik überprüfen.

+0

Ich muss eine Überprüfung mit ihm in einem Trigger machen, also muss ich den Wert in diese Variablen speichern ... und das ist mein Fehler. Aber ich frage mich, wie ich es lösen kann ... – Blackout