【问题标题】:Row in table is getting locked after modifying a certain cell in it in oracle在 oracle 中修改某个单元格后,表中的行被锁定
【发布时间】:2011-10-03 20:25:17
【问题描述】:

我在 oracle 过程中有以下代码,它返回一个游标 (r_cursor) 作为 OUT 参数

SELECT userid
      INTO v_userid
      FROM users u
     WHERE lower(u.email) = lower(p_email)
       AND lower(u.token) = lower(p_IV);

UPDATE users u
   SET u.token = NULL,
       u.lastlogin = sysdate()
 WHERE u.userid = v_userid;

  OPEN r_cursor FOR
    SELECT u.firstname,
           u.lastname
      FROM users u
     WHERE u.userid = v_userid;

从 oracle 调用该过程时,一切正常。

但是从 .Net 应用程序调用该过程时,会引发错误 ORA-24338: statement handle not executed

经过大量测试,我发现如果我从SELECT 语句中删除lower(u.token) = lower(p_IV) 中的一行或从UPDATE 语句中删除u.token = NULL,,则光标返回到.Net 应用程序时没有任何错误。

【问题讨论】:

  • 是调用存储过程还是使用存储过程返回的游标出现错误?前者表明 OPEN 语句从未执行过,或者 .NET 中定义的参数混淆了。后者表示您在到达游标末尾后从游标中获取,可能是因为游标根本没有返回任何行。
  • 使用返回的光标填充数据集时发生错误。 oCon.Open(); oCmd.ExecuteNonQuery(); oDA.Fill(dsCustomer); oDA.Dispose();至于数据,肯定会返回数据,因为 oracle 过程本身工作正常并返回良好的结果。

标签: .net oracle plsql


【解决方案1】:

ORA-24338 通常在您尝试获取尚未打开的游标时引发。

例如,如果您的过程在 OPEN 语句之前引发异常,则可能会引发这种情况。之后,当您尝试从游标中获取时,oracle 将引发 ORA-24338,因为游标从未打开过。

您的 PL/SQL 中是否有 EXCEPTION 块(例如带有 WHEN OTHERS),或者您是否在 .net 中捕获 SQL 异常?

【讨论】:

  • 异常处理在 .net 端完成。奇怪的是,在 oracle 端测试了相同的参数,结果光标是 100% 正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-15
  • 1970-01-01
  • 2020-09-05
  • 1970-01-01
相关资源
最近更新 更多