Oracle [过程] - Sum 函数忽略 WHERE 子句

Oracle [Procedure] - Sum function ignores WHERE clause

我的 ORACLE 过程有问题,似乎 SELECT SUM 忽略了我的 WHERE 子句,并且对所有列求和,而不是仅对我想要的列求和 (deptno)。 但是,如果我使用这样的功能之一,例如:

select SUM(SAL) AS SALSUM FROM SCOTT.EMP WHERE SCOTT.EMP.DEPTNO = 10;

它显示正确的 SUM。 可能是什么问题?感谢您的帮助。

CREATE OR REPLACE PROCEDURE PROCEDURE1(numerdept IN number, money OUT number) IS
    SALSUM NUMBER;
    COMMSUM NUMBER;
WYJATEK EXCEPTION;
BEGIN
    IF numerdept IN (10, 20, 30) THEN
    BEGIN
        select SUM(SAL) INTO SALSUM FROM SCOTT.EMP WHERE SCOTT.EMP.DEPTNO = numerdept;
        select SUM(COMM) INTO COMMSUM FROM SCOTT.EMP WHERE SCOTT.EMP.DEPTNO = numerdept;
        money := SALSUM + COMMSUM;
    END;
    ELSE RAISE WYJATEK;
    END IF;

    EXCEPTION 
    WHEN WYJATEK THEN
    BEGIN
    dbms_output.put_line('Wrong deptno');
    money := NULL; 
    END;
END;
-- checking -- 
SET SERVEROUTPUT ON;
DECLARE
    pension number;
BEGIN
    PROCEDURE1(10, pension);
    dbms_output.put_line(pension);
END;

[编辑 3] 解决方案

select NVL(SUM(SAL), 0) INTO SALSUM FROM SCOTT.EMP WHERE SCOTT.EMP.DEPTNO = numerdept;
select NVL(SUM(COMM), 0) INTO COMMSUM FROM SCOTT.EMP WHERE SCOTT.EMP.DEPTNO = numerdept;

 BEGIN
    dbms_output.put_line('Wrong deptno');
    money := 10; 
END;

你的问题是你的输入参数和你的列同名,所以当查询看到

WHERE SCOTT.EMP.DEPTNO = deptno

它将 deptno 解释为 SCOTT.EMP.DEPTNO,这意味着它对 deptno 的所有值都是正确的。更改输入参数的名称,查询将按预期工作。

您还应该使用 NVL 来确保单个 SUM 值不是 NULL,就好像它们中的任何一个是 NULL 一样,这将使他们 NULL 以及

select NVL(SUM(SAL), 0) INTO SALSUM FROM SCOTT.EMP WHERE SCOTT.EMP.DEPTNO = numerdept;
select NVL(SUM(COMM), 0) INTO COMMSUM FROM SCOTT.EMP WHERE SCOTT.EMP.DEPTNO = numerdept;