今天在调试oracle的时候,测试存储过程时,存储过程只要执行到下面部分时程序oracle总是报ORA-24338:未执行语句句柄错误
TEMP_sSqlText:= 'with TMP_BL2_MZBRXXGET as (select row_number() over(order by a.ID) as rownum1'
|| ' , A.ID,A.BRID,A.MZH,A.DJH,A.XM,A.XB,A.CSRQ,A.SFZH,A.JZDZ,A.KBH,A.KSDM,A.WSSDM,A.YSDM,A.YSMC,A.FZBZ,b.ZDDM1 AS ZDDM,b.ZDMC1 AS ZDMC from HISORCL.mz_ghxx a,mz_bszd b where a.wssdm=b.wssdm and a.id=b.zb_id'
||TEMP_sSql
||') select * from TMP_BL2_MZBRXXGET;'
open CUR_RESULT for(TEMP_sSqlText);
分步执行存储过程,将变量放到sql语句中测试却没有错误,后来经过各种调试终于找到错误,原来在拼接存储过程的时候,在最后多写了一个分号,这种错误真心不好找,后来在网上有搜索了一下,发现下面的情况也有可能出现ORA-24338:未执行语句句柄错误
这个问题主要出现在使用数据库游标的时候.当执行存储过程,返回的游标没有打开时,可能会报这个错。
游标没有打开的情况一般是忘记了写打开游标的语句,也可能是存储过程中执行出错,导致最后游标未打开。
如:
CREATE OR REPLACE package BODY PK_PROFU_GetMtStopTimesInfo
is procedure GetMtStopTimesInfo
(
mMtName varchar2,
mycs out mytype
)
as
v_count int:=0;
begin
select count(1) INTO v_count
FROM WPStopTimesInfo t,MachineTools s
WHERE s.matolname=mMtName AND t.mtid=s.matolid;
if(v_count>0) then
open mycs for select w.matolname , v.stoptimes
FROM WPStopTimesInfo v,MachineTools w
WHERE w.matolname=mMtName AND v.mtid=w.matolid
order by v.stoptimes desc ;
end if;
END;
end;
当上面的变量 v_count=0 时,将出现上述错误.
将其修改成如下所示,问题解决.
CREATE OR REPLACE package BODY PK_PROFU_GetMtStopTimesInfo
is procedure GetMtStopTimesInfo
(
mMtName varchar2,
mycs out mytype
)
as
v_count int:=0;
begin
select count(1) INTO v_count
FROM WPStopTimesInfo t,MachineTools s
WHERE s.matolname=mMtName AND t.mtid=s.matolid;
if(v_count>0) then
open mycs for select w.matolname , v.stoptimes
FROM WPStopTimesInfo v,MachineTools w
WHERE w.matolname=mMtName AND v.mtid=w.matolid
order by v.stoptimes desc ;
else
open mycs for select mMtName as matolname,1 as stoptimes from dual;
end if;
END;
end;
也就是说当游标没有打开的时候就会报此错误