我正在尝试编写存储过程。我需要使用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行
请通过某种解决方案帮助我解决此错误,并在可能的情况下解释为什么此方法无效 预先感谢
答案 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
。
由于facid
是varchar(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;
. . .