oracle查询错误:完全提取返回超过请求的行数

时间:2012-04-03 19:07:00

标签: oracle oracle10g

我有两张表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 个答案:

答案 0 :(得分:2)

当你运行这两个查询时,你是说你得到“ORA-01422:确切的提取返回超过请求的行数”?由于您包含谓词rownum <= 1,因此这似乎不太可能。您可以从在PL / SQL块中仅运行此查询的SQL * Plus会话中剪切和粘贴并生成错误吗?

如果你没有抱怨你在标题中提到的错误,而问题只是你没有得到你期望的数据,可能的问题是你显然有一个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 )