确切的取回结果超出了要求

时间:2018-11-20 09:03:09

标签: sql oracle

我正在尝试编写存储过程。我需要使用id来获取教师ID.id是唯一的,但是当我尝试获取facultyid时我得到了错误:确切的获取返回的数据多于请求的行数

我检查了有关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;

执行该程序时出现此错误:

  

BEGIN UPDATESTATUS(23); END;

     

*

     

第1行出现错误:

     

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

     

ORA-06512:位于“ SYSTEM.UPDATESTATUS”的第9行

     

ORA-06512:在第1行

请通过某种解决方案帮助我解决此错误,并在可能的情况下解释为什么此方法无效 预先感谢

2 个答案:

答案 0 :(得分:0)

SELECT facultyid INTO facid FROM TEMP_LEAVE_DETAILS WHERE id=id;

我还没有使用过oracle,但是在sql server和MySQL中,此查询返回所有facultyid(除非id为null),因为id=id始终为true,除非id为null,因为null=null返回false

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

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

答案 1 :(得分:0)

问题是:

where id = id

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

您需要区分列和参数。我将这段代码写为:

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;

    . . .