查询返回1行,但抛出更多错误

时间:2013-04-25 11:32:47

标签: sql oracle stored-procedures plsql

我有一个非常奇怪的问题。

我有以下查询:

dbms_output.put_line('Prefix : ' || prefix || 'Vendor ID :' || vendor_id);

select  r.rate 
into rate
from rates r
where r.quality = 0
and r.vendor_id = vendor_id
and r.prefix = prefix
and r.direction = 'OUT'
and r.calendar_value = 0
and (sysdate-(1/24/60) >= r.effective_date_from 
and sysdate-(1/24/60)  < nvl(r.effective_date_to, sysdate));

现在rate,vendor_id和prefix是3个变量,所有3个都是数字。 此查询位于存储过程中,在此查询之前,我输出两个vars,打印Prefix : 5 Vendor ID : 361

此查询属于ORA-01422: exact fetch returns more than requested number of rows

问题是,如果我将此查询复制/粘贴到使用5361的过程之外的单独SQL查询,我会得到1行。

有谁知道为什么会发生这种情况?我在使用Oracle 11g

3 个答案:

答案 0 :(得分:0)

我敢打赌你的输入中有重复的内容。请考虑以下数据:

create table rates (pk number not null primary key, rate number, 
  quality number, vendor_id number, prefix number,
  direction varchar2(30), calendar_value number, 
  effective_date_from date, effective_date_to date);      

insert into rates values(1, 2, 0, 361, 5, 'OUT', 0, 
  to_date('2013-04-25 13:40:00', 'YYYY-MM-DD hh24:mi:ss'), 
  to_date('2013-04-25 13:45:00', 'YYYY-MM-DD hh24:mi:ss'));

insert into rates values(2, 3, 0, 361, 5, 'OUT', 0, 
  to_date('2013-04-25 13:45:00', 'YYYY-MM-DD hh24:mi:ss'), 
  to_date('2013-04-25 13:46:00', 'YYYY-MM-DD hh24:mi:ss'));

insert into rates values(3, 4, 0, 361, 5, 'OUT', 0, 
  to_date('2013-04-25 13:45:30', 'YYYY-MM-DD hh24:mi:ss'), 
  null);

(注意第2行和第3行之间的重叠)。

根据此数据,您的查询将返回

  • 如果在13:45:00和13:45:30之间运行,则为1行
  • 如果在13:45:30和13:46:00之间运行,则为2行
  • 之后的一行

答案 1 :(得分:0)

嗯,我不知道这是什么问题。

但是将变量prefixvendor_id更改为不同的名称可以解决问题。

可能它以某种方式与使用相同名称或某物的同一用户的不同程序的变量范围有关,不确定。

答案 2 :(得分:0)

表中可能有一行空格,例如。空格不为空,它是一个字符。但是,在程序外部运行查询时,您可能无法在输出中看到它。 如果存在多于一行或者不存在行,则SELECT INTO或隐式游标将始终引发异常。使用显式游标或处理异常。在您的情况下,例外是Too_Many_Rows。