PL/SQL即使应该也找不到数据?
我目前正在学习PL/SQLATM,我遇到了一个家庭作业问题 在下面的代码中,我获取一个省的用户输入,并在光标声明中使用所述省隔离选择结果,并尝试运行visitsandtotal过程,但我得到的只是找不到数据,为什么 用户提示PL/SQL即使应该也找不到数据?,sql,database,oracle,plsql,oracle-sqldeveloper,Sql,Database,Oracle,Plsql,Oracle Sqldeveloper,我目前正在学习PL/SQLATM,我遇到了一个家庭作业问题 在下面的代码中,我获取一个省的用户输入,并在光标声明中使用所述省隔离选择结果,并尝试运行visitsandtotal过程,但我得到的只是找不到数据,为什么 用户提示 SET SERVEROUTPUT ON ACCEPT prov PROMPT 'Enter Province: '; DECLARE customerprov VARCHAR2(4000); customername VARCHAR2(4000)
SET SERVEROUTPUT ON
ACCEPT prov PROMPT 'Enter Province: ';
DECLARE
customerprov VARCHAR2(4000);
customername VARCHAR2(4000);
visits NUMBER;
total FLOAT;
CURSOR prov_cursor is
Select custprovince, custname
into customerprov, customername
from si.customer
where upper(custprovince) = '&prov';
BEGIN
for c in prov_cursor loop
visitsandtotal(c.custname, visits, total);
dbms_output.put_line('Name: ' || c.custname || ' Visits: ' || visits || ' Total Labor Cost: ' || total);
end loop;
END;
程序
CREATE OR REPLACE PROCEDURE visitsandtotal (
userinput IN VARCHAR2
, visits OUT NUMBER
, total OUT FLOAT
) IS
BEGIN
SELECT
COUNT(*) AS visits
, SUM(s.laborcost) AS totalcost
INTO
visits
, total
FROM
si.customer c
INNER JOIN si.servinv s ON c.custname = s.custname
WHERE
s.custname = userinput
GROUP BY
c.custname
, s.custname ;
END;
错误
Error report -
ORA-01403: no data found
ORA-06512: at "S6_TRAN84.VISITSANDTOTAL", line 7
ORA-06512: at line 11
01403. 00000 - "no data found"
*Cause: No data was found from the objects.
*Action: There was no data from the objects which may be due to end of fetch.
我不能发表评论,因为我的名声不太好 “未找到数据”错误来自于包含where子句和group by的过程 如果没有包含参数“userinput”的记录,则会导致异常 我建议更改程序,因为我们当然不需要按客户名称分组,因为客户名称是where条款的一部分
CREATE OR REPLACE PROCEDURE visitsandtotal
(
userinput IN VARCHAR2
,visits OUT NUMBER
,total OUT FLOAT
)
IS
BEGIN
SELECT COUNT(*) AS visits
,SUM(s.laborcost) AS totalcost
INTO visits
,total
FROM si.customer c
INNER JOIN si.servinv s
ON c.custname = s.custname
WHERE s.custname = userinput;
--removed group by as custname is part of where clause
END visitsandtotal;
但无论出于何种原因,如果坚持保留GROUPBY子句,则必须在过程VISITSANDTOTALL中显式处理NOU DATA FOUND exception
CREATE OR REPLACE PROCEDURE visitsandtotal
(
userinput IN VARCHAR2
,visits OUT NUMBER
,total OUT FLOAT
)
IS
BEGIN
SELECT COUNT(*) AS visits
,SUM(s.laborcost) AS totalcost
INTO visits
,total
FROM si.customer c
INNER JOIN si.servinv s
ON c.custname = s.custname
WHERE s.custname = userinput;
GROUP BY c.custname,s.custname;
-- you dont need to mention custname from both table as join is in place
EXCEPTION
WHEN no_data_found THEN
--HERE - write your exception code whatever you like to add
END visitsandtotal;
当SELECT找不到任何内容时,将返回未找到的数据。这意味着SERVINV表中没有CUSTNAME列值与传递给过程的USERINPUT匹配的行。注意字母大小写(如果在这里重要的话)。基本上,您应该首先确保查询本身在SQL层返回行。他们把它移到过程中。@Littlefoot查询本身就可以工作,这就是为什么我感到困惑的原因。不过,谢谢你提供的额外信息!不客气。嗯,事情就是这样。我们没有你们的数据,所以很难指出确切的问题。若你们发布了测试用例,那个么我们就可以说得更多了?这是您的实际代码吗?我可以重现错误,但前提是您的表(某些)列定义为
char
,而不是varchar2
;但这样一来,它就无法“独立”工作了。你能在问题中添加你的表格定义吗?(我假设两个表都没有名为userinput
的列)非常感谢!包含GROUPBY子句肯定是我没有得到我想要的结果的原因。谢谢你的帮助!