2011-10-03 128 views
2

在它修改某个小区后锁定我有Oracle过程,它返回一个光标(r_cursor),为OUT参数行是越来越在Oracle

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; 

当调用的程序在下面的代码从甲骨文一切工作都很好。

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

大量的测试后,我发现,如果我删除从UPDATE声明SELECT陈述或u.token = NULL,线lower(u.token) = lower(p_IV)之一,光标返回到.NET应用程序没有任何错误。

+0

当您调用存储过程或使用从存储过程返回的游标时是否发生错误?前者表示OPEN语句从未执行,或者.NET中定义的参数混淆。后者表示在达到它的末尾时从光标中取出,可能是因为光标根本没有返回任何行。 – Codo

+0

使用返回的游标填充数据集时发生错误。 oCon.Open(); oCmd.ExecuteNonQuery(); oDA.Fill(dsCustomer); oDA.Dispose(); 以及对于数据来说,由于oracle过程本身工作正常并返回好结果,所以肯定会返回数据。 – Michel

回答

0

当您试图获取尚未打开的游标时,通常会引发ORA-24338

例如,如果您的过程在OPEN语句之前引发异常,则可能会引发此问题。之后,当您尝试从光标读取时,oracle会引发ORA-24338,因为光标从未打开过。

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

+0

异常处理完成.net端。奇怪的部分是相同的参数测试甲骨文方面和导致的光标是100%正确的。 – Michel