Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PL/SQL即使应该也找不到数据?_Sql_Database_Oracle_Plsql_Oracle Sqldeveloper - Fatal编程技术网

PL/SQL即使应该也找不到数据?

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)

我目前正在学习PL/SQLATM,我遇到了一个家庭作业问题

在下面的代码中,我获取一个省的用户输入,并在光标声明中使用所述省隔离选择结果,并尝试运行visitsandtotal过程,但我得到的只是找不到数据,为什么

用户提示

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子句肯定是我没有得到我想要的结果的原因。谢谢你的帮助!