我使用的是Delphi 7、Oracle10和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的帖子,但我无法找出我的代码出了什么问题。
我发现当我在storedproc中添加一个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;实际上我不想要else条件。有没有什么方法可以摆脱这个错误。
发布于 2013-09-19 22:33:17
在我看来,问题在于:在存储过程的第一个版本中,可能没有要返回的结果集,但是在第二个版本中,您在最后一个版本中提供了一个结果集。
当我们通过查看完整的错误报告来理解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.尝试了一个fetch,但在某些情况下,没有任何要获取的结果集,直到您为它提供了最后一个。
您的存储过程通过输出参数返回一个游标,因此您必须始终打开该游标。在代码的第一个版本中,您没有这样做。
发布于 2012-08-17 06:13:08
我不认为DB包PTRAIN本身有任何问题(模式是TRAIN),然而,调用应用程序(Delphi7?)需要知道如何使用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;发布于 2012-08-18 02:57:13
DevArt在2007年8月2日修复了一个错误,上面写着“错误,执行已准备好的存储过程,引用游标参数已修复”。除了他们在错误修复列表中提供的声明之外,我没有任何额外的细节。您的ODAC版本中可能存在该错误。ODAC目前的版本是8.2.8。
https://stackoverflow.com/questions/11991773
复制相似问题