0

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

我有以下查询:

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

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

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

4

3 回答 3

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排之后
于 2013-04-25T11:48:14.793 回答
0

好吧,我不知道是什么问题。

但是改变变量prefixvendor_id不同的名字解决了这个问题。

也许它与使用相同名称或其他东西的同一用户的不同程序的变量范围有关,不确定。

于 2013-04-25T12:21:13.467 回答
0

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

于 2013-04-25T13:54:42.773 回答