2012-04-03 1 views
0

Ich habe zwei Tabellen seatinfo(siid,seatno,classid,tsid) und booking (bookid,siid,date,status).oracle Query-Fehler: genaue Abruf zurück mehr als angefordert keine der Zeilen

Ich habe Eingabeparameter bookDate, v_tsId, v_clsId. Ich brauche genau eine Reihe (Bookid), um zurückzukehren. Diese Abfrage funktioniert nicht. Ich weiß nicht warum. Wie kann ich es reparieren?

select bookid 
    into v_bookid 
    from booking 
    where (to_char(booking.bookdate,'dd-mon-yy'))=(to_char(bookDate,'dd-mon-yy')) 
    and status=0 
    and rownum <= 1 
    and siid in(select siid 
        from seatinfo 
        where tsid=v_tsId 
        and classid= v_clsId); 

Ich habe auch versucht dies:

select bookid 
    into v_bookid 
    from booking, 
     seatinfo 
where booking.siid=seatinfo.siid 
    and (to_char(booking.bookdate,'dd-mon-yy'))=(to_char(bookDate,'dd-mon-yy')) 
    and booking.status=0 
    and rownum <= 1 
    and seatinfo.tsid=v_tsId 
    and seatinfo.classid= v_clsId; 

Antwort

2

Wollen Sie damit sagen, dass Sie einen bekommen „ORA-01422: genaue Rückkehr holen mehr als die angeforderte Anzahl von Zeilen“, wenn Sie diese beiden Abfragen ausführen? Das erscheint sehr unwahrscheinlich, da Sie das Prädikat rownum <= 1 einschließen. Können Sie aus einer SQL * Plus-Sitzung ausschneiden und einfügen, die nur diese Abfrage in einem PL/SQL-Block ausführt und den Fehler generiert?

Wenn Sie sich nicht beschweren über den Fehler, den Sie im Titel erwähnen, und das Problem ist nur, dass Sie nicht die erwarteten Daten erhalten, ist das wahrscheinliche Problem, dass Sie anscheinend einen bookDate Parameter mit dem gleichen Namen haben als eine Spalte in Ihrer Tabelle. Das wird nicht funktionieren. Wenn Sie

(to_char(booking.bookdate,'dd-mon-yy'))=(to_char(bookDate,'dd-mon-yy')) 

sagen, meinen Sie vermutlich die bookDate Spalte in der Tabelle booking gegen den bookDate Parameter zu vergleichen. Da jedoch Spaltennamen Vorrang vor lokalen Variablen haben, wird auf der linken Seite Ihres Ausdrucks auch die Spalte in der Tabelle booking betrachtet. Sie vergleichen also eine Spalte mit sich selbst. Es würde viel mehr Sinn machen, den Namen des Parameters zu ändern (zu, sagen wir, p_bookDate) und dann

booking.bookDate = p_bookDate 

oder schreiben, wenn Sie den Vergleich ignoriert die Zeitkomponente der Daten

trunc(booking.bookDate) = trunc(p_bookDate) 
tun wollen
+0

danke Justin Cave.Yes ich habe ORA-01422: exact fetch gibt mehr als die angeforderte Anzahl von Zeilen "für beide Abfragen. Rownum <= 1 funktioniert gut in PL/SQL.Ich habe versucht, dies (p_bookDate) funktioniert nicht –

+0

@AwladLiton Kannst du "nicht funktionieren" definieren? –

+1

@AwladLiton - Also, was meinst du "' rownum <= 1' funktioniert gut in PL/SQL "? Wenn es" funktioniert ", t Hättest du keinen Fehler bekommen, oder? Aber Sie haben gerade gesagt, dass beide Abfragen, von denen jede eine 'rownum <= 1 '-Klausel hat, Fehler erzeugen. –