oracle 游标的使用

曾作过的一个报表用到的游标很典型,在这里作个备份

 

CREATE OR REPLACE PACKAGE RefCursor
IS type t_RefCursor
IS  ref  CURSOR;
END RefCursor;

 

 

CREATE OR REPLACE PROCEDURE p_tj_collect(p_RCODE in VARCHAR2) as

  v_dqdm       VARCHAR2(10);
  v_SJC        VARCHAR2(100);
  v_sqlstr     varchar2(500);
  v_intstr     varchar2(500);
  v_insfield   varchar2(1000);
  v_dqdm_exist varchar2(3000);
  v_num        int;
  v_idx        int;
  cur_query    RefCursor.t_Refcursor;

  cursor cur_rs is
    select tablename from T_TJ_COLLECT_TAB order by id;

  v_tab T_TJ_COLLECT_TAB.tablename%type;

begin
  v_dqdm_exist := '*';
  v_idx        := -1;
  v_sqlstr     := '';
  --  创建表
  --p_tj_scsjc_crt('');
  delete from t_tj_collect;

  for v_tab in cur_rs loop
    /*    v_sqlstr := 'select T.DQDM,to_char (MAX(T.SJC),''YYYY-MM-DD'') ' ||
    v_tab.tablename || ' from t_scsjc t where t.tablename=''' ||
    v_tab.tablename || ''' and t.dqdm like ''' || p_RCODE ||
    '%'' GROUP BY T.DQDM ORDER BY T.DQDM';*/
 
    p_tj_collect_sql(p_RCODE, v_tab.tablename, v_sqlstr);
 
    OPEN cur_query FOR v_sqlstr;
    LOOP
      FETCH cur_query
        INTO v_dqdm, v_SJC;
      EXIT WHEN cur_query%notfound;
   
      select instr(v_dqdm_exist, '*' || v_dqdm || '*', 1)
        into v_idx
        from dual;
   
      if v_idx = 0 then
        v_intstr := 'insert into t_tj_collect(areacode) values (''' ||
                    v_dqdm || ''')';
        execute immediate (v_intstr);
       
        v_dqdm_exist := v_dqdm_exist || v_dqdm || '*';
      end if;
     
     
      v_intstr := 'update t_tj_collect set ' || v_tab.tablename || ' = ''' ||
                  v_SJC || ''' where areacode = ''' || v_dqdm || '''';
      execute immediate (v_intstr);
   
    END LOOP;
    CLOSE cur_query;
 
  end loop;
end p_tj_collect;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值