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;
我的 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;