我的cur的定义类型是ref cursor。请问这是什么问题,该如何解决?谢谢!
原代码如下:procedure p_aj(cur out sel_tab.cur_aj,casenum in tab_aj_jbxx.ajbh %type,casename in tab_aj_jbxx.ajmc %type,casesort in tab_aj_jbxx.ajlb %type,
flag in varchar2,scene in tab_aj_jbxx.facs %type,district in tab_aj_jbxx.sszrq %type, casedate1 in tab_aj_jbxx.lasj %type,
casedate2 in tab_aj_jbxx.lasj %type,datetype in char)
as
  dynsql varchar2(1000);
    
  begin
 
  if(casenum<>'') 
  then dynsql:='select ajbh,dzbh,dzbm,ajmc,ajlb,sszrq,ajzt from tab_aj_jbxx where ajbh='||casenum;
  end if;
  
  if(casename<>'')
  then dynsql:='select ajbh,dzbh,dzbm,ajmc,ajlb,sszrq,ajzt from tab_aj_jbxx where ajmc='||casename||'%';
  end if;
  
  if(flag<>'')
  then dynsql:=dynsql||' and ajlb<='||flag;
  end if;
  
  if(casesort<>'' and flag='')
  then dynsql:=dynsql||' and ajlb='||casesort;
  end if;
  
  if(scene<>'')
  then dynsql:=dynsql||' and facs='||scene;
  end if;
  
  if(district<>'')
  then dynsql:=dynsql||' and sszrq='||district;
  end if;
  
  if(casedate1<>''and casedate2<>''and datetype='1')
  then dynsql:=dynsql||' and fasjsx between '||casedate1||' and '||casedate2;
  end if;
  
  if(casedate1<>''and casedate2<>''and datetype='2')
  then dynsql:=dynsql||' and sasj between '||casedate1||' and '||casedate2;
  end if;
  
  if(casedate1<>''and casedate2<>''and datetype='3')
  then dynsql:=dynsql||' and lasj between '||casedate1||' and '||casedate2;
  end if;
  
  open cur for dynsql;
  
end p_aj;行号= 150 列号= 8 错误文本= PLS-00455: 游标 'CUR' 不能在动态 SQL OPEN 语句中使用

解决方案 »

  1.   

    CREATE OR REPLACE PROCEDURE ll_02 (p_cursor OUT sys_refcursor) IS
    v_sql varchar2(50);
    BEGIN
    v_sql:='SELECT * from ' || 'b_areas where area_id>''A''';
       OPEN p_cursor FOR
             v_sql;
    END ll_02;
    这种调用没有问题
    也许你dynsql的值有问题
    你的ref cursor类型的没有试过,如果不行就用sys_refcursor类型
      

  2.   

    CREATE OR REPLACE PACKAGE test01 AS
    /******************************************************************************
       NAME:       test01
       PURPOSE:   REVISIONS:
       Ver        Date        Author           Description
       ---------  ----------  ---------------  ------------------------------------
       1.0        2007-8-17             1. Created this package.
    ******************************************************************************/  TYPE v_cursor IS REF CURSOR;
      procedure t_001(p_cursor out v_cursor);END test01;/CREATE OR REPLACE PACKAGE body test01 AS
    /******************************************************************************
       NAME:       test01
       PURPOSE:   REVISIONS:
       Ver        Date        Author           Description
       ---------  ----------  ---------------  ------------------------------------
       1.0        2007-8-17             1. Created this package.
    ******************************************************************************/
      procedure t_001(p_cursor out v_cursor)
      is
     v_sql varchar2(50);
    BEGIN
    v_sql:='SELECT * from ' || 'b_areas where area_id>''A''';
       OPEN p_cursor FOR
             v_sql;
      
      end;END test01;
    --经过测试没有问题