Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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
Oracle 精确提取返回的行数超过请求的行数_Oracle_Plsql - Fatal编程技术网

Oracle 精确提取返回的行数超过请求的行数

Oracle 精确提取返回的行数超过请求的行数,oracle,plsql,Oracle,Plsql,我正在尝试创建一个过程来传递客户编号,并返回去年的购买数量和购买总值。如果没有购买,请将number和total返回零,并返回销售人员去年与该客户的联系人数量 我这样称呼它: DECLARE a_Var NUMBER; b_Var NUMBER; C_Var NUMBER; D_Var NUMBER; BEGIN three_pr(001116,a_Var, b_Var); IF a_Var > 0 THEN

我正在尝试创建一个过程来传递客户编号,并返回去年的购买数量和购买总值。如果没有购买,请将number和total返回零,并返回销售人员去年与该客户的联系人数量

我这样称呼它:

DECLARE 
      a_Var NUMBER;
      b_Var NUMBER;
      C_Var NUMBER;
      D_Var NUMBER;    
BEGIN
      three_pr(001116,a_Var, b_Var);

    IF a_Var > 0 THEN
        DBMS_OUTPUT.PUT_LINE('the number of purchases :' || a_Var);
        DBMS_OUTPUT.PUT_LINE('the total value of purchase :' || b_Var);

    ELSE

        SELECT ContactID,Count(contactID)
        INTO
             C_Var,D_Var
        FROM    DD_Contacts
        WHERE  DateofContact  between to_date ('2012/01/01', 'yyyy/mm/dd')
               AND to_date ('2012/12/31', 'yyyy/mm/dd')
      Group By ContactID;

       DBMS_OUTPUT.PUT_LINE (C_Var||D_Var);

    END IF;

END;
/
使用上述代码时,我得到错误:

ORA-01422:精确提取返回的行数超过请求的行数ORA-06512:在第16行

以下是程序:

CREATE or REPLACE PROCEDURE three_pr

(par_CustomerID IN NUMBER, par_sumpurchase OUT Number,par_totalvalue OUT Number)
IS
BEGIN

        SELECT 
            COUNT(O.OrderID),SUM(Price*Quantity)
        INTO par_sumpurchase,par_totalvalue
            FROM DD_Orders O JOIN DD_OrderLine OL ON O.OrderID = OL.OrderID
            WHERE  DatePurchase  between to_date ('2012/01/01', 'yyyy/mm/dd')
            AND to_date ('2012/12/31', 'yyyy/mm/dd')
            AND CustomerID = par_CustomerID;

END;
/

当查询未返回结果时,过程three\u pr无法正确处理“未找到数据”异常

    CREATE or REPLACE PROCEDURE three_pr

    (par_CustomerID IN NUMBER, par_sumpurchase OUT Number,par_totalvalue OUT Number)
    IS
    BEGIN
        BEGIN
            SELECT 
                COUNT(O.OrderID),SUM(Price*Quantity)
            INTO par_sumpurchase,par_totalvalue
                FROM DD_Orders O JOIN DD_OrderLine OL ON O.OrderID = OL.OrderID
                WHERE  DatePurchase  between to_date ('2012/01/01', 'yyyy/mm/dd')
                AND to_date ('2012/12/31', 'yyyy/mm/dd')
                AND CustomerID = par_CustomerID;
        EXCEPTION
            WHEN NO_DATA_FOUND THEN
                par_sumpurchase := 0;
                par_totalvalue := 0;
        END;

    END;
    /

聚合函数总是返回结果;这里不需要处理“未找到数据”异常。第二个
选择。。。进入…
可能是另一个故事。我想我们都可能有点错。只有在存在group by子句且第一个查询中不存在group by子句的情况下,才会出现未找到的数据。但是,我认为COUNT应该为无记录返回0,但是对于无记录,总和不是空的吗?总和可能为空,但它仍然返回一行,这意味着您可以在这里使用它。如果有一个组,它有可能返回任意数量的行,这意味着可能会引发“未找到数据”或“太多行”异常(这可能是在第二次OPs查询中发生的情况)。您好,欢迎使用堆栈溢出。请始终准确地解释错误,包括错误消息和错误消息等。还建议留下来回答人们可能提出的任何问题;这里的事情发生得很快。请尝试创建一个有意义的标题…虽然您没有给出任何可能不正确的指示,但我猜您的匿名块引发了太多行(或找不到数据)异常。您通过
联系人ID
进行分组,这意味着可以返回多行数据,但您将返回的数据放入标准数字中,而不是某些描述的数组中。因此,正如我所建议的,在匿名块中,您使用精确的提取选择多行。。。您希望从查询返回多少行?