【问题标题】:Oracle stored procedure cursor always returns zero rowsOracle 存储过程游标始终返回零行
【发布时间】:2011-09-08 23:08:30
【问题描述】:

我在包中的一个过程中有这个光标:

PROCEDURE CANCEL_INACTIVE(IN_DAYS_OLD NUMBER)
IS
    CURSOR inactive IS
          SELECT * FROM MY_TABLE
          WHERE STATUS_CHANGED_DATE <= TRUNC(SYSDATE-IN_DAYS_OLD) 
          AND CANCEL_CD IS NULL;

  rec  inactive%ROWTYPE;

BEGIN
     OPEN inactive;
     LOOP
          FETCH inactive INTO rec;
          EXIT WHEN inactive%NOTFOUND;

          -- do an update based on rec.id
     END LOOP;
END;

END CANCEL_INACTIVE;

每次我测试或运行程序时,inactive 总是有零行。但是,当我将 EXACT 相同的查询放入 SQL 窗口时,我得到了我正在寻找的行。

什么鬼?

【问题讨论】:

  • 你怎么知道光标有零行?
  • 您是否使用完全相同的 IN_DAYS_OLD 测试了查询?
  • 我通过使用它的应用程序运行该函数,但没有看到该函数的效果。然后我通过在调试模式下编译并使用测试脚本在我使用的 IDE 中逐步执行代码来验证这一点。
  • @Florin 同样,我已经在声明 IN_DAYS_OLD 的情况下进行了测试。我还通过在其位置放置一个显式整数对其进行了测试。我什至用整数替换了过程本身中的 IN_DAYS_OLD,但我仍然得到零行。
  • 你能在进入前用 dbms_output.put_line('start') 测试,在循环中用 dbms_output.put_line(rec.id) 测试吗?

标签: oracle plsql


【解决方案1】:

您可能正在测试未提交的数据。

或者:您没有根据 rec.id 提交更新。

或者:您的更新什么也不做。 (目标表上的任何行都不满足where子句)

【讨论】:

    猜你喜欢
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 2014-08-31
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多