Oracle PL/SQL 中的 for 循环后变量丢失值

Posted

技术标签:

【中文标题】Oracle PL/SQL 中的 for 循环后变量丢失值【英文标题】:Variable loses value after for loop in Oracle PL/SQL 【发布时间】:2020-06-07 20:49:48 【问题描述】:

我在 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 循环之前声明的,所以我不明白发生了什么。谁能解释如何解决它以及为什么会发生?

编辑:发布完整代码

【问题讨论】:

好吧,我编辑了。 您的代码正在运行。你应该检查你的参数。 我在代码中这样使用它:SELECT working_time() FROM DUAL;并在最后得到“值:”,而在循环内,值是正确的 但是这个函数没有参数,我没有传递任何东西......我应该吗? 是的,这是一个 uni 项目。我尝试制作一个函数并证明它有效。 【参考方案1】:

好的,我发现了问题所在:

在某些情况下 diff 不是数字(这是最后一种情况,所以我认为 for 循环是原因)。

把代码改成

sum_ := sum_ + NVL(diff, 0);

解决了这个问题。

【讨论】:

以上是关于Oracle PL/SQL 中的 for 循环后变量丢失值的主要内容,如果未能解决你的问题,请参考以下文章

oracle pl/sql中的循环及if语句

oracle 10g pl/sql 有条件的循环选择

Oracle / Toad 中的 For 循环

Oracle PL/SQL之LOOP循环控制语句

Oracle PL/SQL之LOOP循环控制语句

Oracle PL/SQL之LOOP循环控制语句