设为首页 收藏本站
查看: 1214|回复: 0

[经验分享] oracle动态游标的简单实现方法

[复制链接]

尚未签到

发表于 2016-8-9 07:09:31 | 显示全部楼层 |阅读模式
  下面就是例子程序
  --明细表打印予处理  通用报表:
procedure mx_print_common(pd_id in mx_pd_syn.pd_id%type,
                   p_pd_mxb_id IN mx_pd_mxb_syn.p_mxb_id%type,
                   p_dept_no IN sc_mxk.dept_code%type,
                   p1 sc_bz_syn.bz_code%type,
                   p2 sc_cjjc_syn.cjjc_code%type,
                   p3 sc_mxk.warehouse_num%type)
is
  sql2 varchar2(500);             --存储查询语句
  sql3 varchar2(500);             --存储查询条件
  str1 sc_print_syn.a%type;   --存储车间进程
  str2 sc_print_syn.b%type;   --存储班组(工艺、工序)进程
  s_ip sc_print_syn.ip%type;
  type cursor_type is ref cursor;
  c1 cursor_type;
  type record_type is record(
        pbom_id sc_mxk.pbom_id%type
  );
  r_c1 record_type;
 /*
  注意上面红色的两行和蓝色的两行
  红色的两行定义一个游标
  蓝色的两行定义一个游标中将要返回的数据的数据结构
  */
      
    cursor c2(p_pbom_id sc_mxk.pbom_id%type) is
        select a.dd_count,b.gx_name,c.bz_name,d.cjjc_name
         from sc_p_gx_syn a,sc_gx_syn b,sc_bz_syn c,sc_cjjc_syn d
          where pbom_id = p_pbom_id
          and a.gx_code=b.gx_code(+) and b.dept_code=p_dept_no
          and a.bz_code=c.bz_code(+)  and b.dept_code=p_dept_no
          and a.cjjc_code=d.cjjc_code(+)  and b.dept_code=p_dept_no;
   
    r_c2 c2%rowtype;
BEGIN
      s_ip :=sys_context('USERENV','IP_ADDRESS');
      delete from sc_print_syn where ip=s_ip and p_id=pd_id;
      commit;
     --下面开始构造查询语句
      sql2:='select distinct a.pbom_id from sc_mxk a';
      sql3:=' where a.p_id=' || pd_id || ' and a.dept_code= ''' || p_dept_no || '''';
  
      if  p_pd_mxb_id >0 then
         sql2:=sql3 || ',mxk c ';
         sql3:=sql3 || ' and c.m_mxb_id= ' || p_pd_mxb_id || ' and a.mxb_id = c.mxb_id';
      end if;
     
      if p1 is not null then
         sql2:=sql2 || ',sc_p_gx_syn b';
         sql3:=sql3 || ' and a.pbom_id=b.pbom_id  and b.bz_code = ''' || p1 || '''';
      end if;
      if p2 is not null then
         sql2:=sql2 || ',sc_p_gx_syn b';
         sql3:=sql3 || ' and a.pbom_id=b.pbom_id  and b.cjjc_code = '''  || p2 || '''';
      end if;
      if p3 is not null then
         sql3:=sql3 || ' and a.warehouse_num = ''' || p3 || '''';
      end if;
      sql2:=sql2 || sql3;
  --打开动态游标,再往下就都一样了
      open c1 for sql2;
        loop
            fetch c1 into r_c1;
            exit when c1%notfound;
            str1:='';
            str2:='';
            --打开工序表进行处理
            open c2(r_c1.pbom_id);
            loop              
                fetch c2 into r_c2;
                exit when c2%notfound; --没有记录退出
                if r_c2.cjjc_name is not null then
                   str1 :=str1 || to_char(r_c2.cjjc_name);
                end if;
                if r_c2.bz_name is not null then
                   str2 := str2  || r_c2.bz_name  ||  to_char(r_c2.dd_count);
                elsif r_c2.gx_name is not null then
                   str2 := str2  || to_char(r_c2.gx_name)  ||  to_char(r_c2.dd_count);
                end if;
       
                
            end loop;
            close c2;
            insert into sc_print_syn(a,b,ip,p_id,r_id)
               values(str1,str2,s_ip,pd_id,r_c1.pbom_id);
                  COMMIT;
        end loop;
        close c1;
END mx_print_common;
  当然,实现的方法一定很多,甚至可以用隐式游标。但是隐式游标中用动态查询语句也要费一些周折的。
  作者:Northsnow
电子邮件:northsnow@163.com
blog:http://blog.csdn.net/precipitant

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-255072-1-1.html 上篇帖子: Oracle启动需要开启的进程 下篇帖子: Oracle:Ora-01791 不是Selected表达式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表