zoukankan      html  css  js  c++  java
  • oracle动态游标的简单实现方法

    下面就是例子程序

     --明细表打印予处理  通用报表:
    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;

    当然,实现的方法一定很多,甚至可以用隐式游标。但是隐式游标中用动态查询语句也要费一些周折的。

  • 相关阅读:
    Palindrome Partitioning
    Minimum Path Sum
    Maximum Depth of Binary Tree
    Minimum Depth of Binary Tree
    Unique Binary Search Trees II
    Unique Binary Search Trees
    Merge Intervals
    Merge Sorted Array
    Unique Paths II
    C++ Primer Plus 笔记第九章
  • 原文地址:https://www.cnblogs.com/cuihongyu3503319/p/975176.html
Copyright © 2011-2022 走看看