【问题标题】:ORA-24338: Statement handle not executedORA-24338: 未执行语句句柄
【发布时间】:2012-08-16 16:38:53
【问题描述】:

我正在使用 Delphi 7、Oracle 10 和 ODAC 组件。

我从 LoadTrainResult 方法调用了一个 storedProc。

    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; 

架构是

    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 的帖子,但我无法找出我的代码有什么问题。

我发现当我将 else 条件添加到存储过程中时,我没有收到错误。

修改后的Proc是

    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;

其实我不想要其他条件。有什么办法可以摆脱这个错误。

【问题讨论】:

  • 会不会是第二个例子有end if 而第一个没有?
  • 您的 ODAC 组件的版本号是多少?
  • Delphi 7 的 ODAC 版本 5.00.1.4
  • 您似乎只使用了一次StoredProc,那么,您为什么要费心准备它呢?只需调用 .Open ,这也可能解决问题。
  • 我删除了 StoredProc.Prepare 然后我也得到了 ORA-24338 错误

标签: oracle delphi delphi-7 odac


【解决方案1】:

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

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

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.

已尝试提取,但在某些情况下,在您提供最后一个 else 之前,没有要提取的任何结果集。

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

【讨论】:

    【解决方案2】:

    我没有看到 DB 包 PTRAIN 本身有任何问题(架构是 TRAIN),但是,调用应用程序(Delphi 7?)需要知道如何使用 cursor。另外,在打开游标时尝试使用动态 SQL -

    OPEN p_cursorvar for    
    'select * from train.course 
    where course = :p_Course' USING p_course;
    

    OPEN p_cursorvar for  
    'select * 
    from train.topic
    where topic = :p_topic' USING p_topic;
    

    【讨论】:

    • 执行 StoredProc.Prepare 语句时出现 ORA-24338: Statement handle not executed 错误。
    【解决方案3】:

    DevArt 在 2007 年 8 月 2 日修复了一个错误,该错误显示“执行准备好的存储过程并修复了 REF 游标参数的错误”。除了他们在错误修复列表中的声明中提供的内容之外,我没有任何其他详细信息。您的 ODAC 版本可能包含该错误。 ODAC 当前版本为 8.2.8。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-03
      • 2018-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多