Oracle [Процедура] - функция Sum игнорирует предложение WHERE - PullRequest
0 голосов
/ 02 февраля 2020

У меня проблема с процедурой ORACLE, кажется, что SELECT SUM игнорирует мое предложение WHERE и суммирует ВСЕ столбцы, а не только те, которые я хочу (deptno). Однако, если я использую одну из следующих функций, например, такую:

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

Отображается правильная сумма. В чем может быть проблема? Спасибо за помощь.

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;

1 Ответ

4 голосов
/ 02 февраля 2020

Ваша проблема в том, что ваш входной параметр имеет то же имя, что и ваш столбец, поэтому, когда запрос видит

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;
...