获取 ORA-01422 的原因:精确提取返回的行数超过了请求的行数

Posted

技术标签:

【中文标题】获取 ORA-01422 的原因:精确提取返回的行数超过了请求的行数【英文标题】:Reason for geting ORA-01422: exact fetch returns more than requested number of rows 【发布时间】:2011-08-15 15:55:44 【问题描述】:

所以我正在开发一个安装程序,安装程序连接到数据库并创建表并填充它们。 除非我尝试将行添加到 certian 表中,否则这方面的每个方面都可以正常工作。

declare
  retVal INTEGER;
  rptID INTEGER;
  catID INTEGER;
  wsID INTEGER;
  paramID INTEGER;
  dtID INTEGER;
begin

  select PK into catID from RPT_CATEGORY where KEYVALUE = 'ProductivityReportsCategory';
  select PK into rptID from RPT_REPORT where KEYVALUE = 'ProductivitySummaryReport2';
  select PK into wsID from RPT_WEBSVC where KEYVALUE = 'NotApplicable' and category_fk = catID;

填充数据库的选择语句如下所示:

  select PK into wsID from RPT_WEBSVC where KEYVALUE = 'GetMachineNameList' and category_fk = catID;
  paramID := RPT_CONFIGURATION.ADD_PARAMETER( rptID, wsID, dtID, 'Machine', 'parameters.GetProductivityDataSet3.inserterid', 4, NULL, NULL, NULL, 0, 0, 0, 'Y', 'Y', 'N', 'N', 'Y' );

还有 13 个这样的 select 语句(我不会添加它们,因为它们都很相似,唯一的区别是存储的值会进入表中。)

我的问题是,当我运行安装程序时,完成后我在日志中收到此错误:

ORA-01422: exact fetch returns more than requested number of rows 
ORA-06512: at line 30

我想知道发生此错误的确切原因是什么,以及解决此错误的方法是什么?

我对该主题进行了一些研究,发现这是我搜索的共同主题:

1.代码中存在错误,开发人员没有意识到您可以返回多行;

2.数据被黑而不是使用API​​导致验证被破坏;

3. 软件没问题,用户所做的没问题,但是同时发生了两个并行更新,并且两者都看不到另一个所做的未提交的更改 - 因此没有正确验证。

我很肯定它不是 #2,但我不太明白其他 2 个原因究竟是什么意思,或者如何解决它们。

非常感谢任何帮助或建议。

谢谢

【问题讨论】:

【参考方案1】:

ORA-01422:精确提取返回的行数超过了请求的行数

只要执行 SELECT INTO 语句并找到多行,就会引发此异常。 SELECT INTO 语句期望准确找到一行,不多也不少 - 否则会引发异常。

在你的例子中:

select PK into wsID from RPT_WEBSVC
where KEYVALUE = 'GetMachineNameList'
and category_fk = catID;

似乎每个 (KEYVALUE, CATEGORY_FK) 组合应该只有一行,但实际上并非如此。如果应该只有一个,那么该表应该对这些列具有唯一约束:

alter table RPT_WEBSVC add constraint RPT_WEBSVC_UK
    unique (KEYVALUE, CATEGORY_FK);

这将阻止某人(或某个进程)再次添加同一行。当然,您需要先对表进行重复数据删除,然后才能添加该约束。

【讨论】:

【参考方案2】:

这意味着“SELECT INTO”语句返回了多行。此语句要求查询只返回一行。否则,您必须使用游标循环来处理行。

在 SQL*Plus 中检查您的选择语句,看看哪个是有问题的查询。

【讨论】:

【参考方案3】:

我会在这里将数字 1 视为问题的原因。如果没有查看所有语句,很难判断哪些查询可能返回多于一行,但这是一个很好的起点,因为数据库架构可以改变...

【讨论】:

以上是关于获取 ORA-01422 的原因:精确提取返回的行数超过了请求的行数的主要内容,如果未能解决你的问题,请参考以下文章

Oracle - ORA-01422:精确提取返回的行数超过了请求的行数

需要 ORA-01422 的解决方案:精确提取返回的行数超过请求的行数

WHILE循环出错:ORA-01422:精确提取返回的请求行数多于请求的行数

我在编程中不断遇到此问题

ORA-01422:- ORA-06512:

PL/SQL ORA-01422 SELECT INTO 错误,Oracle 匿名块(NOVA 环境)