begin
    begin
    --取得记录数
    v_dy_sql_cur :='select count(*) from'||as_tabname||' where  bsflag=''1'' or bsflag=''2'' ';
    execute immediate  v_dy_sql_cur  into v_rownum ;
    EXCEPTION
  WHEN OTHERS THEN
  RETURN -1;--例外处理
    end;
    --声明动态游标, 取得rowid
    v_dy_sql_cur :=' select rowid from '||as_tabname||' where  bsflag=''1'' or bsflag=''2'' ';
    open cur_dy_find for v_dy_dql_cur;
    loop    
    fetch cur_dy_find into v_rowid;      
    exit when  cur_dy_find%notfound;
      f_db_s_getmodifydata_sava(as_tabname ,ai_dbtid ,v_rowid);   
    end loop;
    close cur_dy_find; 
   return v_rownum;
    
end f_db_s_getmodifydata;楼主是否发生例外事件后,也一定要执行f_db_s_getmodifydata_sava(as_tabname ,ai_dbtid ,v_rowid); 此过程?

解决方案 »

  1.   

    我改了
    create or replace function f_db_s_getmodifydata(as_tabname varchar2,ai_dbtid integer) return integer is
      /***********************************************
      *功能描述:根据传入的后台数据表的名称和标示,将其中需要报送的数据,生成动态SQL语句
      *          保存到临时数据表中  
      *传入参数:as_tabname     varchar2   后台数据表名称
      *          ai_dbtaid      integer    后台数据表的标示
      *返回值:成功,返回需要上报的数据行数,否则,出现异常,返回-1
      *作者:陈敏
      ***********************************************/
      v_rownum           integer;         --返回数据行数
      v_fun_test         integer;         --程序执行判断
      v_rowid            varchar2(50);    --数据记录的行标示
      v_dy_sql_cur       varchar2(300);   --声明动态游标的字符串
     cur_dy_find        cursor;
     
    begin
       begin
          --取得记录数
         /*v_dy_sql_cur :='select count(*) from'||as_tabname||' where  bsflag=''1'' or bsflag=''2'' ';*/
          execute immediate  v_dy_sql_cur  into v_rownum ;
          --删除其他数据表生成的纪录
          execute immediate 'delete  from temp_sendtable; commit;';    
          exception 
          when others then 
          return -1;
          end;
        
        --声明动态游标, 取得rowid
         v_dy_sql_cur :=' select rowid from '||as_tabname||' where  bsflag=''1'' or bsflag=''2'' ';
         open cur_dy_find  for  v_dy_sql_cur;
          
         fetch cur_dy_find into v_rowid;
         while cur_dy_find%found loop         
           v_fun_test := f_db_s_getmodifydata_sava(as_tabname,ai_dbtid,v_rowid);
           fetch cur_dy_find into v_rowid;
         end loop;
         close cur_dy_find; 
        return v_rownum;
     exception
        when others then
        return -1;--例外处理
    end f_db_s_getmodifydata;还是不能通过编译,出现如下的提示:
    Compilation errors for FUNCTION KDCERP2.F_DB_S_GETMODIFYDATA
    Error: PLS-00201: 必须说明标识符 'CURSOR'
    Line: 14
    Text: cur_dy_find        cursor;Error: PL/SQL: Item ignored
    Line: 14
    Text: cur_dy_find        cursor;Error: PLS-00320: 此表达式的类型说明不完整或格式错误
    Line: 30
    Text: open cur_dy_find  for  v_dy_sql_cur;Error: PL/SQL: Statement ignored
    Line: 30
    Text: open cur_dy_find  for  v_dy_sql_cur;Error: PLS-00320: 此表达式的类型说明不完整或格式错误
    Line: 32
    Text: fetch cur_dy_find into v_rowid;Error: PL/SQL: SQL Statement ignored
    Line: 32
    Text: fetch cur_dy_find into v_rowid;Error: PLS-00320: 此表达式的类型说明不完整或格式错误
    Line: 33
    Text: while cur_dy_find%found loopError: PL/SQL: Statement ignored
    Line: 33
    Text: while cur_dy_find%found loopError: PLS-00320: 此表达式的类型说明不完整或格式错误
    Line: 37
    Text: close cur_dy_find;Error: PL/SQL: SQL Statement ignored
    Line: 37
    Text: close cur_dy_find;
      

  2.   

    cur_dy_find        cursor;
    修改为:
    type t_sor is ref cursor;
    cur_dy_find  t_sor;