gpt4 book ai didi

c# - 获取 ORA-01422 : exact fetch returns more than requested number of rows 的原因

转载 作者:太空宇宙 更新时间:2023-11-03 17:44:43 24 4
gpt4 key购买 nike

所以我正在开发一个安装程序,安装程序连接到数据库并创建表并填充它们。除了当我尝试将行添加到 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 个这样结构的选择语句(我不会添加它们,因为它们都很相似,唯一的区别是将进入表的存储值。)

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

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

我想知道出现这个错误的具体原因是什么,修复这个错误的方法是什么?

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

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

2.数据被黑客攻击而不是使用API​​,因此验证被破坏;

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

我肯定这不是第二个原因,但我不太明白其他两个原因的确切含义,或者如何解决它们。

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

谢谢

最佳答案

ORA-01422: exact fetch returns more than requested number of rows

只要执行 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);

这会阻止某人(或某些进程)再次添加同一行。当然,在添加该约束之前,您需要对表进行重复数据删除。

关于c# - 获取 ORA-01422 : exact fetch returns more than requested number of rows 的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7067290/

24 4 0
文章推荐: c# - 使用 LINQ .Select() 转换为新类型是否太慢?
文章推荐: html - 如何将