【发布时间】: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 过程本身工作正常并返回良好的结果。