Ошибка запроса Oracle: точная выборка возвращает больше, чем запрошено - PullRequest
0 голосов
/ 03 апреля 2012

У меня есть две таблицы seatinfo(siid,seatno,classid,tsid) и booking (bookid,siid,date,status).

У меня есть входной параметр bookDate, v_tsId, v_clsId.Мне нужно ровно один ряд (bookid), чтобы вернуться.Этот запрос не работает.Я не знаю почему.Как я могу это исправить?

 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);

Я тоже пробовал это:

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;

1 Ответ

2 голосов
/ 03 апреля 2012

Вы говорите, что получаете «ORA-01422: точная выборка возвращает больше, чем запрошенное количество строк», когда вы выполняете оба этих запроса? Это маловероятно, поскольку вы включаете предикат rownum <= 1. Можете ли вы вырезать и вставить из сеанса SQL * Plus, который выполняет только этот запрос в блоке PL / SQL и генерирует ошибку?

Если вы не жалуетесь на ошибку, о которой говорите в заголовке, и проблема в том, что вы не получаете ожидаемых данных, вероятная проблема заключается в том, что у вас, очевидно, есть параметр bookDate, который имеет тот же имя в качестве столбца в вашей таблице. Это не сработает. Когда вы говорите

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

Вы, вероятно, хотите сравнить столбец bookDate в таблице booking с параметром bookDate. Но поскольку имена столбцов имеют приоритет над локальными переменными, левая часть вашего выражения также смотрит на столбец bookDate в таблице booking. Итак, вы сравниваете столбец с самим собой. Было бы гораздо разумнее изменить имя параметра (скажем, p_bookDate), а затем написать

booking.bookDate = p_bookDate

или, если вы хотите сделать сравнение, игнорируя временную составляющую дат

trunc( booking.bookDate ) = trunc( p_bookDate )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...