Oracle 精确提取返回的行数超过请求的行数
我正在尝试创建一个过程来传递客户编号,并返回去年的购买数量和购买总值。如果没有购买,请将number和total返回零,并返回销售人员去年与该客户的联系人数量 我这样称呼它: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
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
进行分组,这意味着可以返回多行数据,但您将返回的数据放入标准数字中,而不是某些描述的数组中。因此,正如我所建议的,在匿名块中,您使用精确的提取选择多行。。。您希望从查询返回多少行?