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

Oracle PL/SQL中for循环后变量丢失值,sql,oracle,plsql,oracle-sqldeveloper,Sql,Oracle,Plsql,Oracle Sqldeveloper,我用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 experi

我用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;
循环的sum_uuinside值打印正确,但在循环外部它不打印任何内容。变量是在for循环之前声明的,所以我不明白发生了什么。有人能解释一下如何修复它以及为什么会发生这种情况吗


编辑:发布完整代码

好的,我发现了错误:

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

将代码更改为

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

解决了问题。

好的,我编辑了。您的代码正常工作。你应该检查你的参数。我在代码中这样使用它:从DUAL中选择working_time;和获取值:在最后,虽然在循环中值是正确的,但是这个函数不接受参数,我不传递任何东西。。。我应该吗?是的,这是大学项目。我试着做一个函数并证明它是有效的。