【问题标题】:Exact fetch returns more than requested精确提取返回的比请求的多
【发布时间】:2019-04-22 16:33:17
【问题描述】:

我正在尝试编写一个存储过程。我需要使用一个 id 来获取学院 ID。ID 是唯一的,但是当我尝试获取学院 ID 时,我得到了错误:精确获取返回的行数超过了请求的行数.

我在 oracle 社区和堆栈溢出检查了许多类似的问题,但没有得到任何正确的答案

我的存储过程如下;

CREATE OR REPLACE PROCEDURE updateStatus(id IN int)

IS  

facid varchar2(10);

total_count int;

accepted_count int;

rejected_count int;

design varchar2(25);

BEGIN

    SELECT facultyid INTO facid FROM TEMP_LEAVE_DETAILS WHERE id=id;

    SELECT design INTO design FROM FACULTY WHERE facultyid=facid;

    SELECT COUNT(*) INTO total_count FROM CLASS_ADJUST WHERE id=id;

    SELECT COUNT(*) INTO accepted_count FROM CLASS_ADJUST WHERE id=id AND 

     accepted='Accepted';

    SELECT COUNT(*) INTO rejected_count FROM CLASS_ADJUST WHERE id=id AND 

     accepted='Rejected';

    IF(total_count=accepted_count) THEN

        IF design='hod' THEN

            UPDATE TEMP_LEAVE_DETAILS SET appr_by='Principal' WHERE id=id;

        ELSE

            UPDATE TEMP_LEAVE_DETAILS SET appr_by='HOD' WHERE id=id;

        END IF;

    END IF;

END;

执行过程时出现此错误:

开始更新状态(23);结束;

*

第 1 行出现错误:

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

ORA-06512:在“SYSTEM.UPDATESTATUS”第 9 行

ORA-06512:在第 1 行

请通过一些解决方案帮助我解决此错误,如果可能,请解释为什么这不起作用 提前致谢

【问题讨论】:

  • 前两个查询返回多少行?超过 1 个?
  • 重命名参数,就没有问题了。

标签: sql oracle


【解决方案1】:
SELECT facultyid INTO facid FROM TEMP_LEAVE_DETAILS WHERE id=id;

我没用过oracle,但是在sql server和MySQL中,这个查询返回所有facultyid(除了id为空的地方)因为id=id总是真除非id为空,因为null=null返回@ 987654326@.

由于facidvarchar(10),它只需要一行。您想通过更改参数 id 的名称在 where 子句中使用不同的条件。

另外,如果有很多行匹配facid,第二个查询可能会出现类似的问题

【讨论】:

  • 很高兴为您提供帮助:D 由于您是 stackoverflow 的新手,我鼓励您投票和/或接受您认为有帮助的答案,以便其他可能面临类似问题的用户更容易注意到它们未来的问题。
【解决方案2】:

问题是:

where id = id

这将返回id 的所有非NULL 值。

您需要区分列和参数。我会把这段代码写成:

CREATE OR REPLACE PROCEDURE updateStatus (
    in_id IN int
) AS  
    v_facid varchar2(10);
    v_total_count int;
    v_accepted_count int;
    v_rejected_count int;
    v_design varchar2(25);
BEGIN
    SELECT facultyid INTO facid
    FROM TEMP_LEAVE_DETAILS tld
    WHERE tld.id = in_id;

    . . .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多