首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ORA-24338:语句句柄未执行

ORA-24338:语句句柄未执行
EN

Stack Overflow用户
提问于 2012-08-17 00:38:54
回答 3查看 69.1K关注 0票数 4

我使用的是Delphi 7、Oracle10和ODAC组件。

通过LoadTrainResult方法,我调用了一个storedProc。

代码语言:javascript
复制
    procedure TfrmTrain.LoadTrainResult;  
    begin  
        StoredProc.StoredProcName :=  'PTRAIN.QTRAIN';    
        StoredProc.Prepare;  
    try        
        StoredProc.ParamByName('P_COURSE').AsString  := CurrentSearch.Course;  
        StoredProc.ParamByName('P_TOPIC').AsString   := CurrentSearch.Topic;  
        StoredProc.ParamByName('P_EMP').AsString     := CurrentSearch.Emp;  
        StoredProc.Open;  
    finally  
        StoredProc.Close;  
    end;  
    end; 

该模式是

代码语言:javascript
复制
    Create or replace PACKAGE TRAIN.pTRAIN  IS 
    TYPE CursorType IS REF CURSOR;   
    PROCEDURE QTRAIN   (p_CursorVar OUT CursorType, p_Course in VarChar2, 
                            p_Topic  in out VarChar2, p_emp in Varchar 2 );  
    END TRAIN.pTRAIN;

    create or replace PACKAGE BODY  TRAIN.pTRAIN  IS  
    PROCEDURE QTRAIN   (p_CursorVar OUT CursorType, p_Course in VarChar2, 
                            p_Topic in out  VarChar2, p_emp in Varchar 2 ) 

    IS    
    BEGIN   
            if p_course is not null then  
            OPEN p_cursorvar for    
                    select * from train.course 
                    where course = p_Course;  
            elsif p_topic is not null then  
            OPEN p_cursorvar for  
                    select * 
                    from train.topic
                    where topic = p_topic;
    end if;         
    Exception
            WHEN OTHERS THEN
            p_TOPIC := '';  
    END QTRAIN;  
    END TRAIN.pTRAIN;

当我编译这个包的时候,我没有得到任何错误。然而,当我运行应用程序时,我得到了一个错误ORA-24338:语句句柄未执行。我调试了我的应用程序,我发现错误发生在StoredProc.Prepare;而不是StoredProc.ExecProc;

我读了这么多关于ORA-24338的帖子,但我无法找出我的代码出了什么问题。

我发现当我在storedproc中添加一个else条件时,我没有得到这个错误。

修改后的Proc是

代码语言:javascript
复制
    create or replace PACKAGE BODY  TRAIN.pTRAIN  IS  
    PROCEDURE QTRAIN   (p_CursorVar OUT CursorType, p_Course in VarChar2,
                             p_Topic in out  VarChar2, p_emp in Varchar 2 )  
    IS    
    BEGIN   
            if p_course is not null then  
            OPEN p_cursorvar for    
            select *    from train.course 
       where course = p_Course; 

            elsif p_topic is not null then
            OPEN p_cursorvar for
            select * from train.topic
       where topic = p_topic  

            else   
            OPEN p_cursorvar for  
            select * from emp whhere empid = p_emp; 

            end if;
            Exception
            WHEN OTHERS THEN
            p_TOPIC := '';  
            END QTRAIN;  
    END TRAIN.pTRAIN;

实际上我不想要else条件。有没有什么方法可以摆脱这个错误。

EN

回答 3

Stack Overflow用户

发布于 2013-09-19 22:33:17

在我看来,问题在于:在存储过程的第一个版本中,可能没有要返回的结果集,但是在第二个版本中,您在最后一个版本中提供了一个结果集。

当我们通过查看完整的错误报告来理解ORA-24338的含义时,我的疑虑更加强烈:

代码语言:javascript
复制
Error: ORA-24338
Text: statement handle not executed 
---------------------------------------------------------------------------
Cause: A fetch was attempted before executing a statement handle. 
Action: Execute a statement and then fetch the data.

尝试了一个fetch,但在某些情况下,没有任何要获取的结果集,直到您为它提供了最后一个

您的存储过程通过输出参数返回一个游标,因此您必须始终打开该游标。在代码的第一个版本中,您没有这样做。

票数 6
EN

Stack Overflow用户

发布于 2012-08-17 06:13:08

我不认为DB包PTRAIN本身有任何问题(模式是TRAIN),然而,调用应用程序(Delphi7?)需要知道如何使用cursor。此外,在打开游标时尝试使用动态SQL,如-

代码语言:javascript
复制
OPEN p_cursorvar for    
'select * from train.course 
where course = :p_Course' USING p_course;

代码语言:javascript
复制
OPEN p_cursorvar for  
'select * 
from train.topic
where topic = :p_topic' USING p_topic;
票数 0
EN

Stack Overflow用户

发布于 2012-08-18 02:57:13

DevArt在2007年8月2日修复了一个错误,上面写着“错误,执行已准备好的存储过程,引用游标参数已修复”。除了他们在错误修复列表中提供的声明之外,我没有任何额外的细节。您的ODAC版本中可能存在该错误。ODAC目前的版本是8.2.8。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11991773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档