我正在使用 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的帖子,我无法找出我的代码有什么问题。
我发现当我在storedproc中添加一个else条件时,我没有得到错误。
修改后的程序为
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;
其实我不想要其他条件。有没有什么办法可以消除这个错误。
3条答案
按热度按时间rur96b6h1#
在我看来,问题在于:在第一个版本的存储过程中,可能没有返回结果集,但在第二个版本中,您在最后一个else中提供了结果集。
当我们通过查看完整的错误报告来理解ORA-24338的含义时,我的怀疑更加强烈:
已尝试获取,但在某些情况下,没有任何要获取的结果集,直到您提供最后一个else。
您的存储过程通过输出参数返回一个游标,因此您总是必须打开该游标。在你的代码的第一个版本中,你没有。
z6psavjg2#
我没有看到DB包
PTRAIN
有任何问题(模式是TRAIN
),但是,调用应用程序( Delphi 7?)需要知道如何使用cursor
。另外,尝试在打开游标时使用动态SQL,如-然后呢
enxuqcxy3#
DevArt在2007年8月2日修复了一个bug,上面写着“使用REF游标参数执行准备好的存储过程的Bug”。除了他们在bug修复列表中的声明中提供的内容外,我没有任何其他细节。您的ODAC版本可能有这个bug。ODAC目前的版本是8.2.8。