Oracle 中的 for 循环后变量丢失值 PL/SQL
Variable loses value after for loop in Oracle PL/SQL
我在 Oracle SQL 中编写了以下脚本:
CREATE OR REPLACE FUNCTION working_time
RETURN INT
IS
diff INT;
sum_ INT;
CURSOR cur IS SELECT * FROM users_;
BEGIN
sum_ := 0;
FOR usr IN cur LOOP
SELECT SUM(NVL(end_, CURRENT_DATE) - start_)
INTO diff
FROM experience
WHERE user_ = usr.id_;
sum_ := sum_ + diff;
IF usr.id_ != 100 THEN
DBMS_OUTPUT.PUT_LINE('User ' || usr.first_name || ' ' || usr.last_name || ' has worked for ' || diff || ' days.');
END IF;
DBMS_OUTPUT.PUT_LINE('return: ' || sum_);
END LOOP;
DBMS_OUTPUT.PUT_LINE('return: ' || sum_);
RETURN sum_;
END working_time;
for循环内sum_的值打印正确,但在循环外什么都不打印。该变量是在 for 循环之前声明的,所以我不明白发生了什么。任何人都可以解释如何修复它以及为什么会这样吗?
编辑:发布完整代码
好的,我发现问题所在:
在某些情况下 diff 不是数字(这是最后一种情况,所以我认为是 for 循环的原因)。
将代码更改为
sum_ := sum_ + NVL(diff, 0);
解决了问题。
我在 Oracle SQL 中编写了以下脚本:
CREATE OR REPLACE FUNCTION working_time
RETURN INT
IS
diff INT;
sum_ INT;
CURSOR cur IS SELECT * FROM users_;
BEGIN
sum_ := 0;
FOR usr IN cur LOOP
SELECT SUM(NVL(end_, CURRENT_DATE) - start_)
INTO diff
FROM experience
WHERE user_ = usr.id_;
sum_ := sum_ + diff;
IF usr.id_ != 100 THEN
DBMS_OUTPUT.PUT_LINE('User ' || usr.first_name || ' ' || usr.last_name || ' has worked for ' || diff || ' days.');
END IF;
DBMS_OUTPUT.PUT_LINE('return: ' || sum_);
END LOOP;
DBMS_OUTPUT.PUT_LINE('return: ' || sum_);
RETURN sum_;
END working_time;
for循环内sum_的值打印正确,但在循环外什么都不打印。该变量是在 for 循环之前声明的,所以我不明白发生了什么。任何人都可以解释如何修复它以及为什么会这样吗?
编辑:发布完整代码
好的,我发现问题所在:
在某些情况下 diff 不是数字(这是最后一种情况,所以我认为是 for 循环的原因)。
将代码更改为
sum_ := sum_ + NVL(diff, 0);
解决了问题。