包中的一个过程。大致代码如下:create or replace package body pa_name is  procedure sp_name(c out cur) /*这边的cur 在包头中已经定义*/
 as
 begin
if 条件1 then
 open c for select 'ERROR:包名称已存在,请确认!!!' FROM DUAL;
else
 ...
...
...(一些操作) OPEN C FOR SELECT '☆包已经成功创建☆' 提示信息 FROM DUAL;
end if;
end;
end pa_name ;
符合条件1时,返回的提示信息正常,符合条件2时,其他的操作的正常,但是游标没有返回提示信息,报如题的错误,高手们帮忙看看怎么回事呢?找了半天原因还是没解决。

解决方案 »

  1.   

    看看别人是怎么解决的!--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;
      

  2.   

    嗯,O(∩_∩)O谢谢大家指点
    ☆这个字符去掉也是一样的~
    我是在包中动态的创建包,假如包名已经存在的话返回条件1的提示,不存在的话执行条件2下面的动态SQL语句,然后再返回个成功创建的提示。select count(1) into v_num from user_soource where type='PACKAGE' AND NAME=UPPER('xx');
    if count(1)>0 then 
      open c for select 'ERROR:包名称已存在,请确认!!!' FROM DUAL;
    else 
     ...
      动态语句...
     OPEN C FOR SELECT '包已经成功创建' 提示信息 FROM DUAL;
    end if;
    end;...
    没有OPEN C FOR SELECT '包已经成功创建' 提示信息 FROM DUAL;这个语句的话都是正常的,加上没有显示,不懂了~
    大家继续帮我看看~
      

  3.   

    ee。有必要用cursor做返回么,直接返回varchar2不就可以了?
      

  4.   

    你吧其他操作先去掉,就只剩下那条open for语句试试
    看看是不是你那些其他操作的问题